【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 abc 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]
]
Solution 1:
排序后,先把一个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 };

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2017-02-09 09:19  会咬人的兔子  阅读(138)  评论(0编辑  收藏  举报