LeetCode 15. 三数之和_有序数组

 

思路

方法:排序 + 双指针

先排序,之后有序数组,固定一个数,对后面的有序序列进行双指针查找,双指针方法见此题:​​LeetCode 167. 两数之和 II - 输入有序数组​

LeetCode 15. 三数之和_双指针_02

1 class Solution {
2 public:
3 vector<vector<int>> threeSum(vector<int>& nums) {
4 vector<vector<int>> res;
5 if(nums.size() < 3) {
6 return res;
7 }
8
9 //从小到大排序
10 sort(nums.begin(), nums.end());
11 int n = nums.size();
12 for(int i = 0; i < n; ++i) {
13 if(nums[i] > 0) {
14 //因为是从小到大排好了序,所以遇到的数大于0,后面全都会大于0,肯定不会出现三数之和等于0的情况了
15 break;
16 }
17
18 if(i > 0 && nums[i] == nums[i-1])
19 continue; //去重
20
21 int L = i+1, R = n-1;
22 while(L < R) {
23 int sum = nums[i] + nums[L] + nums[R];
24 if(sum == 0) {
25 vector<int> v({nums[i], nums[L], nums[R]});
26 res.push_back(v);
27 while(L < R && nums[L] == nums[L+1]) L++; //去重
28 while(L > R && nums[R] == nums[R-1]) R--; //去重
29 L++;
30 R--;
31 } else if (sum < 0) {
32 L++;
33 } else {
34 R--;
35 }
36 }
37
38 }
39
40 return res;
41 }
42 };

复杂度分析

时间复杂度:O(n2),排序是O(nlogn),固定一个数,对后序进行双指针查找,这个过程是O(n2),所以总体是O(n2)。

 

原文:​​画解算法:15. 三数之和​