三数之和
时间:2022-07-22
本文章向大家介绍三数之和,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
JavaScript实现LeetCode第15题. 三数之和
题目描述
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
解题方法
使用排序 + 双指针
方法解决;
- 首先进行数组排序,时间复杂度 O(nlogn)
- 对数组nums进行遍历,每遍历一个值利用其下标 i,形成一个固定值
nums[i]
- 如果
nums[i]
大于0, 则三数之和必然无法等于0,直接结束循环 - 如果 nums[i] == nums[i-1],则说明该数字重复,会导致结果重复,所以应该跳过
- 再使用前指针指向
start = i + 1
处,后指针指向end = nums.length - 1
,也就是结尾处 - 根据
sum = nums[i] + nums[start] + nums[end]
结果,判断 sum 与 0 的大小关系,满足则添加进入结果,此时start++; end--
如果sum < 0
,则start++
, 如果sum > 0
, 则end--
- sum === 0 的时候还要考虑结果重复的情况
- nums[start] == nums[start+1] 则会导致结果重复,应该跳过,start++
- nums[end] == nums[end-1] 则会导致结果重复,应该跳过,end--
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
let result = [];
let len = nums.length;
if(nums === null || len < 3) {
return result;
}
nums.sort((a, b) => a - b);
for(let i = 0; i < len; i++) {
// 如果当前数字大于0,则三数之和一定大于0,所以结束循环
if(nums[i] > 0) {
break;
}
// 去重
if( i > 0 && nums[i] === nums[ i - 1]) {
continue;
}
let start = i + 1;
let end = len - 1;
while(start < end) {
let sum = nums[i] + nums[start] + nums[end];
if(sum === 0) {
result.push([nums[i], nums[start], nums[end]]);
// 去重
while(start < end && nums[start] === nums[start + 1]) {
start++;
}
// 去重
while(start < end && nums[end] === nums[end - 1]) {
end--;
}
start++;
end--;
} else if(sum < 0) {
start++;
} else if(sum > 0) {
end--;
}
}
}
return result;
};
- DATUM和BigchainDB
- MySQL主从复制的实现过程
- 使用dict和set
- 区块链技术(二):以太坊编程语言Solidity安装及入门初体验
- SQL注入测试神器sqlmap
- 人工智能也分强与弱?
- 【Scikit-Learn 中文文档】集成方法 - 监督学习 - 用户指南 | ApacheCN
- 2017黑科技 颠覆生活哪家强?
- ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【解读ServiceCallSite 】
- ASP.NET MVC的View是如何呈现出来的[实例篇]
- 把人类向机器人乞讨,变成对机器人征税
- 印度6大科技真相 会让很多人大吃一惊
- 了解ASP.NET MVC几种ActionResult的本质:HttpStatusCodeResult & RedirectResult/RedirectToRouteResult
- Python原创0基础入门一看几张图就学会了
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 3分钟短文 | MySQL存时间,到底该用timestamp还是datetime?
- js中class的继承的基础用法
- JavaScript 设计模式学习总结与感悟(开发&面试必备)
- 3分钟短文 | PHP多维数组搜索值,就只能for循环?这样写更高效
- 如何获得tomcat管理员账号
- ant target间的dependency
- 如何用ant将JSP项目打成war包
- 3分钟短文 | MySQL备份和迁移sql文件,这个指令基础又关键
- 如何用ant给Java项目生成文档
- ant build里如何指定classpath
- Tomcat服务器java.lang.IllegalArgumentException异常
- 动态控制SAP CRM附件的可编辑性
- 关于node.js:ExpressJS、Websocket中的session会话共享
- 【STM32F429开发板用户手册】第23章 STM32F429的USART串口基础知识和HAL库API
- 【STM32F407开发板用户手册】第23章 STM32F407的USART串口基础知识和HAL库API