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

解题思路

【leetcode题解】三数之和图解 - 图1

代码

  1. class Solution {
  2. public:
  3. vector<vector<int>> threeSum(vector<int>& nums) {
  4. sort(nums.begin(), nums.end());
  5. set<vector<int>> S;
  6. vector<vector<int>> res;
  7. int N = nums.size();
  8. for(int i = 0 ; i < N-2 ; i++)
  9. {
  10. if(nums[i] > 0) break;
  11. if(i > 0 && nums[i] == nums[i-1]) continue;
  12. int target = -nums[i];
  13. int leftGuard = i+1;
  14. int rightGuard = N-1;
  15. while(leftGuard < rightGuard)
  16. {
  17. if(target == nums[leftGuard] + nums[rightGuard])
  18. {
  19. S.insert({nums[i], nums[leftGuard], nums[rightGuard]});
  20. while(leftGuard < rightGuard && nums[leftGuard] == nums[leftGuard+1]) leftGuard++;
  21. while(leftGuard < rightGuard && nums[rightGuard] == nums[rightGuard-1]) rightGuard--;
  22. leftGuard++;
  23. rightGuard--;
  24. }
  25. else if(nums[leftGuard] + nums[rightGuard] > target) rightGuard--;
  26. else leftGuard++;
  27. }
  28. }
  29. for(auto it : S)
  30. {
  31. res.push_back(it);
  32. }
  33. return res;
  34. }
  35. };