15.三数之和
    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 _a + b + c = _0 ?请你找出所有和为 0 且不重复的三元组。
    注意:答案中不可以包含重复的三元组。

    示例 1:
    输入:nums = [-1,0,1,2,-1,-4]
    输出:[[-1,-1,2],[-1,0,1]]
    示例 2:
    输入:nums = []
    输出:[]
    先将数组排序,固定一个数,将另两个数看为两数之和进行操作(使用双向指针)

    1. class Solution {
    2. public:
    3. vector<vector<int>> threeSum(vector<int>& nums) {
    4. sort(nums.begin(),nums.end());
    5. vector<vector<int>> result;
    6. int n = nums.size();
    7. for(int i=0;i<n;i++)
    8. {
    9. //如果第一个数都>0直接返回
    10. if(nums[i]>0)
    11. break;
    12. //去重,从第二个数开始,若当前数与前一个数相同,则跳过
    13. if(i>0 && nums[i]==nums[i-1])
    14. continue;
    15. //双指针
    16. int left = i+1;
    17. int right = n-1;
    18. while(left<right)
    19. {
    20. if(left>=right)
    21. break;
    22. //若满足条件,则记录数据,并将指针收缩范围
    23. if(nums[i]+nums[left]+nums[right]==0)
    24. {
    25. result.push_back(vector<int>{nums[i],nums[left],nums[right]});
    26. left++;
    27. right--;
    28. //去重,若出现重复的数字就继续收缩
    29. while(left<right && nums[left] == nums[left-1])left++;
    30. while(left<right && nums[right] == nums[right+1])right--;
    31. }
    32. else if(nums[i]+nums[left]+nums[right]>0)
    33. right--;
    34. else
    35. left++;
    36. }
    37. }
    38. return result;
    39. }
    40. };