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 };