三数之和
/**
* @param {number[]} nums
* @return {number[][]}
转载转载转载转载转载转载
*/
var threeSum = function(nums) {
// 采用双指针方法
// 1、首先判断nums数组长度,如果小于3 或者 升序排序后第一个元素大于0 则直接返回空数组
let res = []
nums.sort((a,b)=>a-b)
if(nums.length < 3 || nums[0] > 0) return res
// 2、对nums数组进行for循环
for(let i = 0; i < nums.length ; i++){
// 3、对连续相同的元素去重 (第一个元素不执行)
if(i>0 && nums[i] === nums[i -1]) continue
// 4、定义左指针
let Left = i + 1
// 5、定义右指针
let Right = nums.length - 1
// 6、指定当前元素为a 进行while循环判断b和c 条件是Left 小于 Right 由两边向中间夹
while(Left < Right){
let num = nums[i] + nums[Left] + nums[Right]
// 7、如果num 三数之和等于0 则push到结果数组res中,并且要再判断下一元素是否与当前元素相同
if(num === 0){
res.push([nums[i],nums[Left],nums[Right]])
// 8、对左指针的下一元素 也就是左指针右边的元素 进行去重处理
while(Left < Right && nums[Left] === nums[Left + 1]) Left++
// 9、对右指针的下一元素 也就是右指针左边的元素 进行去重处理
while(Left < Right && nums[Right] === nums[Right - 1]) Right--
// 10、如果没有左右都没有重复 则左边指针向右移动一个 右边指针向左移动一个
Left++
Right--
}
// 11、如果num 三数之和小于0 则左指针向右移动一个
else if (num < 0){
Left++
}
// 12、如果num 三数之和大于0 则右指针向左移动一个
else if (num > 0){
Right--
}
}
}
// 13、执行完循环,最后返回结果数组 res
return res
};
要么dp(动态规划) 要么空间换时间 要么就对数据做预处理 这个就属于预处理