【39】15. 3Sum
15. 3Sum
Description Submission Solutions Add to List
- Total Accepted: 181480
- Total Submissions: 861812
- Difficulty: Medium
- Contributors: Admin
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]
排序后,先把一个k提出来,设target为0-s[k],然后再用two sum(两个指针的方法)。注意排除重复元素。
1 class Solution { 2 public: 3 vector<vector<int>> threeSum(vector<int>& nums) { 4 sort(nums.begin(), nums.end()); 5 vector<vector<int>> res; 6 for(int k = 0; k < nums.size(); k++){ 7 if(nums[k] > 0) break;//排序过后的第一个肯定是负数 8 while(k > 0 && nums[k] == nums[k - 1]) k++;//避免重复 9 int target = 0 - nums[k]; 10 int i = k + 1; 11 int j = nums.size() - 1; 12 while(i < j){ 13 if(nums[i] + nums[j] == target){ 14 res.push_back({nums[k], nums[i], nums[j]});//直接pushback,不要用vector<int> level了 15 i++;//别忘了 16 j--; 17 while(i < j && nums[i] == nums[i - 1]) i++;//避免重复 18 while(i < j && nums[j] == nums[j + 1]) j--;//两个方向 加减1不同 19 20 21 }else if(nums[i] + nums[j] < target){ 22 i++; 23 }else{ 24 j--; 25 } 26 } 27 } 28 return res; 29 } 30 };
Solution 2: 用set来避免重复
1 class Solution { 2 public: 3 vector<vector<int>> threeSum(vector<int>& nums) { 4 sort(nums.begin(), nums.end()); 5 set<vector<int>> res; 6 for(int k = 0; k < nums.size(); k++){ 7 if(nums[k] > 0) break;//排序过后的第一个肯定是负数 8 //while(k > 0 && nums[k] == nums[k - 1]) k++;//避免重复 9 int target = 0 - nums[k]; 10 int i = k + 1; 11 int j = nums.size() - 1; 12 while(i < j){ 13 if(nums[i] + nums[j] == target){ 14 //res.push_back({nums[k], nums[i], nums[j]});//直接pushback,不要用vector<int> level了 15 res.insert({nums[k], nums[i], nums[j]}); 16 i++;//别忘了 17 j--; 18 while(i < j && nums[i] == nums[i - 1]) i++;//避免重复 19 while(i < j && nums[j] == nums[j + 1]) j--;//两个方向 加减1不同 20 21 22 }else if(nums[i] + nums[j] < target){ 23 i++; 24 }else{ 25 j--; 26 } 27 } 28 } 29 return vector<vector<int>>(res.begin(), res.end()); 30 } 31 };