题解 | #数组中相加和为0的三元组#
数组中相加和为0的三元组
http://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711
先判断数组数量是否大于3
然后给数组排序,判断前三个数的和是否大于0,如果大于,则return
设置i为三元组的第一个数,l为第二个,r为第三个
从0开始遍历i,l=i+1,r=num.size()-1
然后判断三个数的和--x,当大于0,将r--,小于0,将l++,等于0,l++, r--
删除重复的三元组:----->>当x==0时,如果num[l+1] == num[l],将l++,如果num[r-1]==num[r],将r--;同时,每次遍历开始时如果num[i]==num[i-1],就跳过当前遍历,进入下一轮遍历
vector<vector<int> > threeSum(vector<int> &num) { vector<vector<int> > res; if(num.size() < 3) return res; sort(num.begin(), num.end()); if(num[0] + num[1] + num[2] > 0) return res; for(int i = 0; i < num.size() - 2; i++) { if(num[i] > 0) break; if(i && num[i] == num[i-1]) continue; for(int l = i + 1, r = num.size() - 1; l < r;) { vector<int> ans; int x = num[i] + num[l] + num[r]; if(x < 0) l++; else if(x > 0) r--; else { ans.push_back(num[i]); ans.push_back(num[l]); ans.push_back(num[r]); res.push_back(ans); while(num[l] == num[l+1] && l + 1 < r) l++; while(num[r] == num[r-1] && r - 1 > l) r--; l++; r--; } } } return res; }