本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
二、思路分析:
这个事情是这样的,你首先要把原来的数组排个序(别问为什么排序,大多数思路都是建立再排完序的基础上的),然后就开始码了。
记得以前碰过类似的题目,不过应该是二数之和类型的,三数之和就显然麻烦得很,为了尽可能降低时间复杂度,应用双指针的方法,在过程中先排除一些明显不可能的情况(数组长度不够、最小和为负、最大和为正等情况)。
解法的关键是遍历元素,然后用双指针开始两头找,因为你已经从小到大排过序了,所以确保和小于零右指针右移找更大的数,和大于零左指针左移找更小的数,找到头都没找到那就是真没有了,中间元素位置往后移。
三、AC代码:
var threeSum = function(nums) {
if(nums.length<3) return [];
let len = nums.length;
nums.sort((a, b) => a - b);
let result = [];
let left,right,count;
for(let i=0;i<len-2;i++) {
if(nums[i]==nums[i-1]) continue;
if(nums[i]+nums[i+1]+nums[i+2]>0) break;
if(nums[i]+nums[len-2]+nums[len-1]<0) continue;
left = i+1;
right = len-1;
while(left<right){
count = nums[i]+nums[left]+nums[right];
if(count<0) left++;
else if (count>0) right--;
else {
result.push([nums[i], nums[left], nums[right]]);
while(left<right && nums[left]==nums[left+1]) left++;
while(left<right && nums[right]==nums[right-1]) right--;
left++;
right--;
}
}
}
return result;
};
四、总结:
三数相加的评论区↓