class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>>arr;
if(nums.size()<3)
return arr; //数字不够三个,那么直接返回
sort(nums.begin(),nums.end()); //进行排序从小到大
if(nums[0]>0) return arr; //如果排序好的第一个数字都大于0,那么直接退出就行了,不可能=0的
for(int i=0;i<nums.size()-2;i++) //固定一个数,然后用双指针指向其余两个
{
int x = i+1; //首
int y = nums.size()-1; //尾
if(i>0 &&nums[i] == nums[i-1]) continue; //如果说固定的那个数字和前面固定的数字一样,那么跳过,因为这次遍历的结果肯定和上次是一样的
while(x<y) //条件不过界
{
if(nums[i]+nums[x]+nums[y]<0) x++; //固定的数,在加他后面的边界如果小于0,说明nums[x]太小,大一点才可能等于0
else if(nums[i]+nums[x]+nums[y]>0) y--; // //固定的数,在加他后面的边界如果大于0,说明nums[y]太大,小一点才可能等于0
else //如果相等的情况
{
vector<int>array; //存储数据
array.push_back(nums[i]);
array.push_back(nums[x]);
array.push_back(nums[y]);
arr.push_back(array);
while(x<y && nums[x] == nums[x+1]) x++; //左边界跳过相同的值
while(x<y && nums[y] == nums[y-1]) y--; //右边界跳过相同的值
x++; //左边界到了一个新的值(和下标-1后的值不同的)
y--; //左边界到了一个新的值(和下标+1后的值不同的)
}
}
}
return arr; //返回arr
}
};
慢慢试出来的hhh