【LeetCode算法题解】5、三数之和

443 阅读1分钟

题目

难度:⭐️

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例

示例 1:

输入:nums = [-1,0,1,2,-1,-4]

输出:[[-1,-1,2],[-1,0,1]]

示例 2:

输入:nums = []

输出:[]

示例 3:

输入:nums = [0]

输出:[]  

提示:

0 <= nums.length <= 3000

-105 <= nums[i] <= 105

题解

/**
* @param {number[]} nums
* @return {number[][]}
*/

var threeSum = function(nums) {
	const result = [];	
	nums.sort(function(a, b){	
		return a - b;	
	})

  	for(let i = 0; i < nums.length-2; i++){
		if(i === 0 || nums[i] !== nums[i-1]){	
			let start = i+1;		
			let end = nums.length-1;
	
			while(start<end){		
				if(nums[i]+nums[start]+nums[end] === 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{
					end --
				}
			}
                }
	}

return result

};

笔记

此类型题目,可以先给数组排序,然后遍历数组,从0遍历到length-2(防止数组溢出)

如果当前的数字等于前一个数字,则跳过这个数(避免结果相同)

如果数字不同,则设置start=i+1,end=length-1,查看i,start和end三个数的和比零大还是小,如果比0小,start++,如果比0大,end--,如果等于0,把这三个数加入到结果里

最后返回结果