求数组中和为0的三元组
数组中相加和为0的三元组
https://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711?tpId=188&&tqId=36162&rp=1&ru=/ta/job-code-high-week&qru=/ta/job-code-high-week/question-ranking
1. 题目描述
给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。
注意:
三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c)
解集中不能包含重复的三元组。
例如,给定的数组 S = {-10 0 10 20 -10 -40},解集为(-10, 0, 10) (-10, -10, 20)
2. 解题思路
找出存在的三元组的和为0。
3. 代码
class Solution { public: vector > threeSum(vector &num) { int n = num.size(); //if(num.empty()) return {}; //if(n<3) return {{num}; vector> result; if(num.empty()) return result; sort(num.begin(),num.end()); for(int k=0; k<n; k++){ if(num[k]>0) break; // 开始遍历元素就大于0 必然不存在和为0的三元组 int temp = -num[k]; // 遍历后面是否有两个元素相加等于temmp int left = k+1,right = n-1; while(left<right){ int sum = num[left]+num[right]; if(sum==temp){ vector re(3); re[0] = num[k]; re[1] = num[left]; re[2] = num[right]; result.push_back(re); while(left<right&&num[left]==re[1]) left++; // 如果有重复 跳过 while(left<right&&num[right]==re[2]) right--; } else if(sum<temp){ left++; //值小了 通过left 增加 } else if(sum>temp){ right--; } } while(k+1<n&&num[k]==num[k+1]) ++k; } return result; } };