
解析
解法1
- 首先对数组进行排序,排序后固定一个数 nums[i],再使用左右指针指向nums[i]后面的两端,数字分别为 nums[l]和 nums[r],计算三个数的和 sum 判断是否满足为 0,满足则添加进结果集。
- 因为已经排好顺序了
- 如果 nums[i]大于 0,则三数之和必然无法等于 0,结束循环
- 如果 nums[i]== nums[i-1],则说明该数字重复,会导致结果重复,所以应该跳过
- 当 sum == 0 时
- nums[l] == nums[l+1] 则会导致结果重复,应该跳过,l++
- nums[r] == nums[r-1] 则会导致结果重复,应该跳过,r--
- 时间复杂度:O(n^2),n为数组长度
var threeSum = function(nums) {
let result = []
let len = nums.length
nums.sort((a,b) => a-b)
if(len < 3){
return result
}
for(let i = 0; i < len ; i++){
if(nums[i] > 0) break
if(nums[i] === nums[i-1]) continue
let l = i + 1
let r = len - 1
while( l < r){
let sum = nums[i] + nums[l] + nums[r]
if(sum === 0){
result.push([nums[i],nums[l],nums[r]])
while(l<r && nums[l] === nums[l+1]) l++
while(l<r && nums[r] === nums[r-1]) r--
l++
r--
}else if(sum < 0){
l++
}else if(sum > 0){
r--
}
}
}
return result
};