第一遍写有一定的思路,但是就是写不出来。参考第一个题解,写一个c++版本 主要思路为排序+双指针 size < 3 直接返回
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
sort(nums.begin(), nums.end());
int n = nums.size();
for(int i = 0; i < n - 2; i++) {
// 当迭代中的最小的一个元素都大于0,数组后面的元素肯定也都大于0,所以已经可以直接返回了
if(nums[i] > 0) {
return result;
}
// i > 0 是为了避免初始化i=0的时候判断
// 如果没有 i > 0的话,会出现num[-1],数组越界,error
if(i > 0 && nums[i] == nums[i-1]) {
// 去除重复的,两种情况:一种这个i找到了sum = 0,去除重复值;未找到,这个未找到,相等的value也一定找不到
continue;
}
int j = i + 1;
int k = n - 1;
while(j < k) {
int sum = nums[i] + nums[j] + nums[k];
if(sum == 0) {
// 可以记忆一下
// 一个vector{1, 1, 1}或者{'1', '2', '3'}
result.push_back({nums[i], nums[j], nums[k]});
// 避免重复
while(j < k && nums[j] == nums[j+1]) {
j++;
}
// 避免重复
while(j < k && nums[k] == nums[k-1]) {
k--;
}
// 需要j++ k++是因为指针还未脱离重复值,自己细品...
j++;
k--;
}
// 太大了
// 这个我在思考能不能同样去重重复值
// 比如[-2, 0, 1, 1, 4, 4],去除4 4
else if(sum > 0) {
k--;
}
// 太小了
else {
j++;
}
}
}
return result;
}
};