leetcode 15 3Sum

题目:

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]
]

思路:

先排序。

第一种思路:从左往右遍历,将第一个数字和第二个数字固定下来,然后对后面的数字进行二分查找,这样子的时间复杂度是o(n * n * log(n));

第二种思路:从左往右遍历,只固定第一个数字,然后同时向右和向左移动指针,判断三个数字相加的和是否为0。细节处理在于如果第一个数字重复,则无须再考虑,同时找到一组解之后要忽略掉重复的,注意避免陷入死循环。时间复杂度是o(n * n)。

 

代码:

 1 class Solution {
 2 public:
 3     vector<vector<int> > threeSum(vector<int>& nums) {
 4         vector<vector<int> > vec;
 5         sort(nums.begin(),nums.end());
 6         for(int i = 0;i < ((int)nums.size() - 2);i++)
 7         {
 8             if(i > 0 && nums[i] == nums[i - 1])
 9                 continue;
10             int temp = nums[i];
11             for(int j = i + 1,k = (int)nums.size() - 1;j < k;)
12             {
13                 if(temp + nums[j] + nums[k] == 0)
14                 {
15                     int arr[3] = {temp,nums[j],nums[k]};
16                     vector<int> ans(arr,arr+3);
17                     vec.push_back(ans);
18                     while(j < (int)nums.size() - 1 && nums[j] == nums[j + 1]) j++;
19                     while(k > j && nums[k] == nums[k - 1]) k--;
20                     j++;
21                     k--;
22                 }
23                 else if(temp + nums[j] + nums[k] > 0) k--;
24                 else j++;
25             }
26         }
27         return vec;
28     }
29 };

 

posted on 2018-01-22 15:03  Tracy-mac  阅读(93)  评论(0编辑  收藏  举报

导航