Loading

LeetCode 15. 三数之和

 

思路

方法:排序 + 双指针

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

 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. 三数之和

posted @ 2021-03-01 11:58  拾月凄辰  阅读(65)  评论(0编辑  收藏  举报