题目
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
输入: nums = [-1,0,1,2,-1,-4] 输出: [[-1,-1,2],[-1,0,1]]
题解
我们第一步需要先给数组从小到大进行排列起来,因为数组初始状态是乱序,乱序是不方便我们进行操作的,然后进行遍历数组,遍历数组时我们需要从下标0遍历到数组长度-2,主要为了防止下标越界,因为
i
变量在倒数第二个数的话,start
变量要是start=i+1
那么就指向了最后一个数,end
变量则不能去指向最后一个数,这样的话就是一个数字我们用两遍,这样的操作是我们不想看到的,如果当前的数字等于前一个数字则跳过这个数,主要是为了去重,如果数字不同,则设置start=i+1
和end=length-1
,并且查看i
和start
以及end
三个变量的值相加的和比零大还是比零小,如果比零小,那么start++
,如果比零大,那么end--
,如果等于零,那就就把这三个数增加到结果中,进行返回
/** * @param {number[]} nums * @return {number[][]} */ var threeSum = function(nums) { //声明一个空数组用于接受结果 const result=[] //先将数组进行排序 nums.sort((a,b)=>a-b) //对当前的数组进行循环并且在i变量小于nums数组长度-2的情况下停止循环 for(let i=0;i<nums.length-2;i++){ //当前数字为第一个或者当前的数字和之前的数字是不相等的进入这个循环,否则就会出现重复数字的结果 if(i==0||nums[i]!==nums[i-1]){ let start=i+1,end=nums.length-1; //如果start是小于end的情况下就去判断他们三个的和,再把start的取得值往里缩 while(start<end){ //我们这里一共有三种结果,第一种情况等于零,这也是我们所需要的结果,第二种情况小于零,第三种情况大于零 if(nums[i]+nums[start]+nums[end]==0){ //等于0则把当前的数追加到接受结果的数组中 result.push([nums[i],nums[start],nums[end]]) start++; end++; //把新值挪到和旧值不相等为止 while(start<end&&nums[start]===nums[start-1]){ start++; } while(start<end&&nums[end]===nums[end+1]){ end--; } }else if(nums[i]+nums[start]+nums[end]<0){ start++; }else if(nums[i]+nums[start]+nums[end]>0){ end--; } } } } //返回结果 return result };
坚持努力,无惧未来!