15. 三数之和

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 _a + b + c = _0 ?请你找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例: 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]

解题思路

排序后使用双指针**

  1. #include<algorithm>
  2. class Solution {
  3. public:
  4. vector<vector<int>> threeSum(vector<int>& nums) {
  5. vector<vector<int>> res;
  6. if(nums.size() < 3)
  7. return res;
  8. int len = nums.size();
  9. sort(nums.begin(),nums.end());
  10. int i=0;
  11. int left;
  12. int right;
  13. for(int i=0;i<len;i++){
  14. if(nums[i] > 0 )
  15. return res;
  16. if(i>0 && nums[i] == nums[i-1])
  17. continue;
  18. left = i+1;
  19. right = len-1;
  20. while(left < right){
  21. if(nums[i] + nums[left] + nums[right] == 0){
  22. vector<int> temp;
  23. temp.push_back(nums[i]);
  24. temp.push_back(nums[left]);
  25. temp.push_back(nums[right]);
  26. res.push_back(temp);
  27. while(left < right && nums[left] == nums[left+1]){
  28. left++;
  29. }
  30. while(left < right && nums[right] == nums[right-1]){
  31. right--;
  32. }
  33. left++;
  34. right--;
  35. }else if(nums[i] + nums[left] + nums[right] > 0 ){
  36. right--;
  37. }else{
  38. left++;
  39. }
  40. }
  41. }
  42. return res;
  43. }
  44. };