15. 三数之和 (思维)

题目连接:

https://leetcode-cn.com/problems/3sum/

题目大意:

中文题目

具体思路:

使得 a +b +c = 0,这个等式成立有如下情况

1. 都为0

2. 一正两负/两正一负

3. 一正一负一零

观察之后,除了0这种情况,都会存在一个负数,我们可以第一步枚举负数,枚举完之后,再从剩下的数中凑得等式成立

我们将所有的数进行排序之后,第一部分枚举负数,第二部分通过两个指针来凑数

关于去重,如果负数都相同,这个好判断。

需要考虑的是剩下的两个数的去重,我们可以通过一个临时变量,保存b的值,如果a,b都相同,那么c一定相同,通过这个来实现去重功能

AC代码:

 1 class Solution {
 2 public:
 3     vector<vector<int>> threeSum(vector<int>& nums) {
 4         vector<vector<int>>ans;
 5         vector<int>tmp;
 6         int len = nums.size();
 7         if(len<3) 
 8             return ans;
 9         int i, tmp_sum = 0x3f3f3f3f, di;
10         
11         sort(nums.begin(), nums.end());
12         for(i = 0; i < len - 2; i++){
13             if(nums[i] > 0)break;
14             if(nums[i] == -tmp_sum)continue;
15             tmp.push_back(nums[i]);
16             tmp_sum = -nums[i];
17             int l = i + 1, r = len - 1;
18             di = nums[l] - 1;
19             while(l < r){
20                 if(nums[i] + nums[l] + nums[r] == 0){
21                     if(nums[l] != di){
22                     tmp.push_back(nums[l]);
23                     tmp.push_back(nums[r]);
24                     ans.push_back(tmp);
25                     tmp.pop_back();
26                     tmp.pop_back();
27                     di = nums[l];
28                     }
29                     l++;
30                     r--;
31                 }
32                 else if(nums[l] + nums[r] > -nums[i]){
33                     r--;
34                 }
35                 else if(nums[l] + nums[r] < -nums[i]){
36                     l++;
37                 }
38             }
39             tmp.pop_back();
40         }
41       return ans;   
42     }
43 };

 

posted @ 2019-09-17 18:32  Let_Life_Stop  阅读(176)  评论(0编辑  收藏  举报