算法 15.三数之和
思路
- 给数组排序
- 遍历数组,从0遍历到
length-2
(因为一个数固定,两个数可以移动)- 如果当前的数组等于前一个数字,则跳过这个数(作用:去重)
- 如果数字不同,则设置
start = i + 1
,end = length - 1
,查看i
,start
,end
三个数的和 比零大还是小- 如果三数之和比0小,
start++
,如果比0大,end--
简单理解:
3数之和,将一个数固定,根据三数之和,移动
start
和end
来达到总和0
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
if(nums.length < 3) return []
let resArr = []
nums = nums.sort(function(a, b){return a-b})
for(let i = 0; i < nums.length-2; i++){
if(nums[i] === nums[i-1]){
continue
}
let start = i+1
let end = nums.length-1
while(start < end){
if(nums[start] + nums[end] + nums[i] === 0){
resArr.push([nums[start],nums[end],nums[i]])
start++
end--
// [-2,0,0,2,2]防止此类错误
while(start < end && nums[start] === nums[start-1]){
start++
}
while(start < end && nums[end] === nums[end+1]){
end--
}
}else if(nums[start] + nums[end] + nums[i] < 0){
start++
}else{
end--
}
}
}
return resArr
};