先确定一个数A再寻找两个数B、C之和为A的相反数
为避免对遍历所有两个数的组合 – 排序
如果遍历到大于0的数直接break – 和不可能为0
如果两数之和等于target – 放入答案 左侧 i++ 并且右侧 j–
如果两数之和小于target – 让和变大 左侧 i++
如果两数之和大于target – 让和变小 左侧 i++ 并且右侧 j–
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(),nums.end());
if (nums.empty() || nums.back() < 0 ||nums.front()>0) return {};
for (int k = 0; k <(int)nums.size() -2;++k){
if(nums[k] > 0) break;
if(k > 0 && nums[k]==nums[k-1])continue;
int target = 0 - nums[k], i = k + 1, j = (int)nums.size() - 1;
while(i<j) {
if(nums[i] + nums[j] == target)
{
res.push_back({nums[k], nums[i],nums[j]});
while (i < j && nums[i] == nums[i + 1]) ++i;
while (i < j && nums[j] == nums[j - 1]) --j;
++i;
--j;
} else if (nums[i] + nums[j] < target) ++i;
else --j;
}
}
return res;
}
};