三数之和
Posted panjingshuang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三数之和相关的知识,希望对你有一定的参考价值。
题目:
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
/** * @param number[] nums * @return number[][] */ function comp(a,b) return a-b; var threeSum = function(nums) nums.sort(comp); let left=0; let temp = []; let right ; let sum =0; if(nums.length<3) return temp; for(let i=0;i<nums.length;i++) if(nums[i]>0) break; if(i>0&&nums[i] == nums[i-1]) continue; left = i+1; right = nums.length-1; while(left<right) sum = nums[i]+nums[right]+nums[left]; if(sum===0) temp.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 --; else if(sum>0) right--; else left ++; return temp; ;
实现方式:先排序(从小到大),如果最左边的数大于0说明,没有可以组成0的数据,直接返回[];正常情况下:如果构成的数小于0,则需要将中间指针向右移动一位,如果构成的数大于0则需要将最右的数据向前移动一位;如果最左面最右面以及中间的数据可以构成0的就将其放到temp数组中,同时将中间(left)和右边(right),找到不是相同的下一位数据;如此循环。
来源:https://leetcode-cn.com/problems/3sum/solution/hua-jie-suan-fa-15-san-shu-zhi-he-by-guanpengchn/
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
以上是关于三数之和的主要内容,如果未能解决你的问题,请参考以下文章