【刷题日记】15. 三数之和

15. 三数之和

两数之和可以用巧思也可以用map

三数之和会更加复杂一点,且这道题还需要考虑避免重复答案!

思路:

  1. 特判:检如果numsnull 或长度小于 3直接返回空数组。
  2. 排序:使用 sort对数组进行升序排序。就变成了(-x,0,x)这样子的顺序。
  3. 遍历数组:遍历数组确定第一个数cur=num【i】。如果当前数和前一个数相同跳过(去重);如果 cur 大于 0,直接 break,因为后面加上任何更大的数和都不会是 0了。
  4. 双指针:初始化两个指针 lr(分别指向cur后续数的最左和最右数)。进入 while 循环(条件是l<r),计算三数之和sum。
  • 如果 sum === 0:找到一个三元组,添加到结果 res 中。然后进行去重,移动左指针 l 和右指针 r,直到遇到不同的值。(这个很重要!!)
  • 如果 sum < 0:左指针 l++增加总和。
  • 如果 sum > 0:右指针 r--减少总和。

代码:

//排序+双指针
var threeSum = function (nums) {let res = [];let len = nums.length;if (nums == null || len < 3) return res;nums.sort((a, b) => a - b);//升序排序(-x,0,x从小到大)for (let i = 0; i < len; i++) {let cur = nums[i];//第一个数(当前数)if (nums[i] > 0) break;//和后面的数相加也不会会是0if (i > 0 && cur == nums[i - 1]) continue;//去重(注意要判断i>0,因为第一个数没有前一个数)let l = i + 1, r = len - 1;//双指针,当前数之后数的前后结点while (l < r) {const sum = nums[l] + nums[r] + cur;if (sum === 0) {res.push([cur, nums[l], nums[r]])while (l < r && nums[l] == nums[l + 1]) l++;//去重while (l < r && nums[r] == nums[r - 1]) r--;//去重l++;r--;} else if (sum < 0) {l++;} else {r--;}}}return res;
};

 注意,我这里一开始有想过,直接在找三元组的时候,对num用set去重,这样子是不行的,因为题目所说的:

指的是同一个位置的数不能重复出现在三元组中,只是下标不能相同,但不是值不能相同。

所以需要去重的是最终的组合,而不是值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/145255.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

京东h5st 4.8逆向

最开始扒的时候版本号还是4.1&#xff0c;现在已经到了4.8了&#xff0c;原来的AES也没有了&#xff0c;现在都是魔改的加密方法&#xff0c;还整成了vmp。跟了一下整个流程&#xff0c;和原来的流程大差不差&#xff0c;h5st变长了&#xff0c;一共分9部分。简单走一下流程。 …

玩具车检测系统源码分享

玩具车检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

web基础—dvwa靶场(十二)JavaScript Attacks

JavaScript Attacks (前端攻击) 本章节中的攻击旨在帮助您了解如何在浏览器中使用 JavaScript 以及如何对其进行操作&#xff0c;攻击可以通过分析网络流量来实现&#xff0c;但这不是本章节的重点而且可能要困难得多。 只需提交单词 “success” 即可攻击成功&#xff0c;显然…

编写程序,在一行上显示1-5数字,每个相邻的数字要求用空格进行分开

目录 前言 一、一行输出&#xff08;使用一个System语句输出&#xff09; 二、多行输出&#xff08;使用多&#xff08;N&#xff09;个System语句输出&#xff09; 三、循环输出&#xff08;使用for语句循环在通过System语句输出&#xff09; 四、完整代码 前言 1.本文所…

图神经网络池化方法

图神经网络池化方法 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 图神经网络池化方法前言一、扁平图池化二、分层图池化1.节点聚类池化2.节点丢弃池化 参考文献 前言 图池化操作根据其池化策略的差异&#xff…

windows C++-并行编程-并行算法(四)- 并行排序

并行模式库 (PPL) 提供了对数据集合并行地执行工作的算法。这些算法类似于 C 标准库提供的算法。并行算法由并发运行时中的现有功能组成。 PPL 提供三种排序算法&#xff1a;concurrency::parallel_sort、concurrency::parallel_buffered_sort 和 concurrency::parallel_radix…

志邦家居CIO吴俊涛谈转型:天润融通如何赋能家居行业未来

根据国家统计局、住建部等各部门综合数据显示&#xff0c;2024年国内泛家居全渠道销售额在预计将超过4.7万亿元&#xff0c;并且在存量房需求释放与智能家居品类创新的推动下&#xff0c;预计2027年将突破5.3万亿元&#xff0c;展现出强劲的增长弹性。 然而&#xff0c;家居行…

【Mysql】为modified_time和created_time设置默认值

建立表SQL&#xff1a; CREATE TABLE your_table_name (id int(11) NOT NULL AUTO_INCREMENT,/* 其他字段 */created_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 创建日期,modified_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 修改…

如果 Linux 这么好,为什么没有更多的人使用它呢?

原文&#xff1a;DHH - 2024.09.02 几周前&#xff0c;我在推特上看到一个问题&#xff1a;“如果 Linux 这么好&#xff0c;为什么没有更多的人使用它呢&#xff1f;” 这是一个很合理的问题&#xff01;在你仔细考虑之前&#xff0c;直觉上这是正确的。Linux 甚至是免费的&a…

neo4j关系的创建删除 图的删除

关系的创建和删除 关系创建 CREATE (:Person {name:"jack"})-[:LOVE]->(:Person {name:"Rose"})已有这个关系时&#xff0c;merge不起效果 MERGE (:Person {name:"Jack" })-[:LOVE]->(:Person {name:"Rose"})关系兼顾节点和关…

10_Python流程控制_循环

循环 循环是控制程序重复执行特定代码块的关键结构。Python提供了几种不同的循环结构&#xff0c;以满足不同的编程需求。 While循环 while 循环会重复执行一个代码块&#xff0c;只要指定的条件为真。 适用情况&#xff1a;不清楚具体的循环次数&#xff0c;或者当条件一直…

“科学突破奖”获得者连续两篇Nature,成功绘制人类主要激酶底物特异性图谱

激酶研究进展 近期Nature期刊发表关于酪氨酸激酶的研究文章。这是威尔康奈尔医学癌症中心Jared L. Johnson和Lewis C. Cantley团队自2023年成功绘制丝/苏氨酸激酶底物特异性图谱后&#xff0c;时隔一年后再次成功绘制酪氨酸激酶底物特异性图谱&#xff0c;为理解激酶在信号传导…

MyBatis 分批次执行(新增,修改,删除)

import com.google.common.collect.Lists;import java.util.Iterator; import java.util.List; import java.util.function.Consumer;/*** Description mybatis分批插入数据使用* Author WangKun* Date 2024/9/19 11:20* Version*/ public class MyBatisSqlUtils {/*** param d…

Linux进阶命令-scp

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 经过上一章Linux日志的讲解&#xff0c;我们对Linux系统自带的日志服务已经有了一些了解。我们接下来将讲解一些进阶命令&am…

快速编写一款python漏洞批量检测工具

一、前言 以下列检测脚本示列&#xff1a; import requestsimport urllib3import re,string,randomfrom urllib.parse import urljoinimport argparseimport timeimport sslssl._create_default_https_context ssl._create_unverified_contexturllib3.disable_warnings(urllib…

如何给zip文件设置自动加密,保护压缩包不被随意打开

ZIP是日常生活和工作中经常用到的压缩文件格式&#xff0c;对于重要的文件&#xff0c;我们往往还会设置打开密码&#xff0c;保护压缩包不被随意打开。 如果每次压缩文件都要设置一次密码&#xff0c;操作久了还是有点麻烦&#xff0c;那有没有一种方法&#xff0c;只要压缩文…

usemeno和usecallback区别及使用场景

1. useMemo 用途: useMemo 用于缓存计算结果。它接受一个函数和依赖项数组&#xff0c;只有当依赖项发生变化时&#xff0c;才会重新计算该函数的返回值。否则&#xff0c;它会返回缓存的值。 返回值: useMemo 返回的是函数执行后的结果。 使用场景: 当一个计算量大的函数在每…

openCV3.0 C++ 学习笔记补充(自用 代码+注释)---持续更新 三(61-)

环境&#xff1a;OpenCV3.2.0 VS2017 61、轮廓集合重排序(按轮廓面积从小到大) //对轮廓集合面积从大到小排序 bool compareValue_bs(const std::vector<cv::Point> & c1, const std::vector<cv::Point> & c2) {int area1 cv::contourArea(c1);int area…

【Python进阶】requests库有哪些常用的参数和方法?一篇文章带你详细了解!!!附带源码

常用的requests库参数和方法 常用方法 requests库中定义了多个常用的请求方法&#xff0c;其中requests.get()和requests.post()是最常用的方法。这些方法对应于HTTP协议中的GET和POST方法。 requests.get(url, paramsNone, **kwargs): 用于发送GET请求。requests.post(url…

116页可编辑PPT全面了解数据治理体系、平台,数据质量数据标准

概览 《行业大数据治理平台》是一个全面深入探讨大数据治理的PPT文档&#xff0c;共116页&#xff0c;涵盖了建设背景、解决方案、核心功能以及实际应用案例等多个方面。 核心议题 数据作为资产的重要性和全生命周期管理。信息系统建设方案的演变及其面临的问题。数据资产运营…