三数之和~
三数之和本题题意可以看作i<j<k所以遍历数组时候选中一个数,另外两个数用双指针算法进行求解
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>>ans;
for(int i=0;i<nums.size()-2;i++)//遍历i,本题i<j<k,所以仅需遍历到num.size()-2
{
int x=nums[i];
if(i&&x==nums[i-1])continue;//防止找到重复的组合,因为前一个i已经找到了但是后一个相同就重复了
if(x+nums[i+1]+nums[i+2]>0)break;//因为排序过了如果x+最小的两个都比0大那么后面就不可能有=0的了
if(x+nums[nums.size()-1]+nums[nums.size()-2]<0)continue;//这个和break有区别,但是本意和上面的差不多
int j=i+1,k=nums.size()-1;//双指针
while(j<k)
{
int s=x+nums[j]+nums[k];
if(s>0)k--;
else if(s<0)j++;
else//这个else就是三数之和为0
{
ans.push_back({x,nums[j],nums[k]});//加入ans
for (j++; j < k && nums[j] == nums[j - 1]; j++); // 和第一个if同样的意思
for (k--; k > j && nums[k] == nums[k + 1]; k--); // 和第一个if同样的意思
}
}
}
return ans;
}
};