15. 三数之和 (思维)
Posted letlifestop
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ;
以上是关于15. 三数之和 (思维)的主要内容,如果未能解决你的问题,请参考以下文章
思维导图整理大厂面试高频数组补充1: 最接近的三数之和 和 三数之和 的两个不同之处, 力扣16
思维导图整理大厂面试高频数组补充1: 最接近的三数之和 和 三数之和 的两个不同之处, 力扣16
❤️导图整理数组4: 三数之和 相比于 两数之和 的难点, 力扣15❤️