暴力破解的话,3层循环,肯定是不是这个目的,这里需要用到3指针来达到目的。
对数组进行排序后,在来移动指针。
固定i指针,k、j指针在后面进行收缩,这里要注意排除相同的答案,所以第6、13、14行代码是用来进行排除相同答案的
错误代码
这里存在的主要问题是去重,这里在未进入循环之前,就已经去重了,导致一些正确结果不会push到结果之中
var threeSum = function (nums) {
nums.sort((a, b) => a - b);
let n = nums.length;
let res = [];
for (let i = 0; i < n; ++i) {
if (i > 0 && nums[i] === nums[i - 1]) continue;
let k = i + 1,
j = n - 1;
while (k < n && nums[k] === nums[k + 1]) k++;
while (j < n && nums[j] === nums[j - 1]) j--;
while (k < j) {
let sum = nums[i] + nums[k] + nums[j];
if (sum === 0) {
res.push([nums[i], nums[k], nums[j]]);
k++;
j--;
} else if (sum > 0) {
j--;
} else {
k++;
}
}
}
return res;
};
正确代码
var threeSum = function (nums) {
let n = nums.length
nums.sort((a, b) => a - b)
let res = []
for (let i = 0; i < n; ++i) {
if (i > 0 && nums[i] === nums[i - 1]) continue
let k = i + 1
let j = n - 1
while (k < j) {
let sum = nums[i] + nums[j] + nums[k]
if (sum === 0) {
res.push([nums[i], nums[k], nums[j]])
while (k < j && nums[k] === nums[k + 1]) k++
while (k < j && nums[j] === nums[j - 1]) j--
k++
j--
} else if (sum > 0) {
j--
} else {
k++
}
}
}
return res
};