标签:right 15 nums ++ 三数 三元组 数组 Leetcode left
三数之和
题目
给定一个包含 n
个整数的数组nums
,判断 nums
中是否存在三个元素a,b,c
,使得 a + b + c = 0 ?
找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
思路
题目中说明可能会出现多组结果,所以我们要考虑好去重
- 1.为了方便去重,我们首先将数组排序
- 2.对数组进行遍历,取当前遍历的数
nums[i]
为一个基准数,遍历数后面的数组为寻找数组 - 3.在寻找数组中设定两个起点,最左侧的
left
(i+1
)和最右侧的right
(length-1
) - 4.判断
nums[i] + nums[left] + nums[right]
是否等于0,如果等于0,加入结果,并分别将left
和right
移动一位 - 5.如果结果大于0,将
right
向左移动一位,向结果逼近 - 5.如果结果小于0,将
left
向右移动一位,向结果逼近
注意整个过程中要考虑去重
代码
var threeSum = function (nums) {
const result = [];
//从小到大排列
nums.sort((a, b) => a - b);
for (let i = 0; i < nums.length; i++) {
// 跳过重复数字
if (i && nums[i] === nums[i - 1]) { continue; }
//左指针
let left = i + 1;
//右指针
let right = nums.length - 1;
while (left < right) {
const sum = nums[i] + nums[left] + nums[right];
if (sum > 0) {
right--;
} else if (sum < 0) {
left++;
} else {
//值=0 加入结果数组
result.push([nums[i], nums[left++], nums[right--]]);
//继续移动指针寻找
// 跳过重复数字
while (nums[left] === nums[left - 1]) {
left++;
}
// 跳过重复数字
while (nums[right] === nums[right + 1]) {
right--;
}
}
}
}
return result;
}
更多资料
整理不易,若对您有帮助,请给个「关注+点赞」,您的支持是我更新的动力
标签:right,15,nums,++,三数,三元组,数组,Leetcode,left 来源: https://blog.csdn.net/weixin_43786756/article/details/112665609
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。