給定一個(gè)包含 n 個(gè)整數(shù)的數(shù)組 nums驹暑,判斷 nums 中是否存在三個(gè)元素 a拨脉,b,c 葫慎,使得 a + b + c = 0 ?找出所有滿(mǎn)足條件且不重復(fù)的三元組。
注意:答案中不可以包含重復(fù)的三元組憨愉。
例如, 給定數(shù)組 nums = [-1, 0, 1, 2, -1, -4],
滿(mǎn)足要求的三元組集合為:
[
[-1, 0, 1],
[-1, -1, 2]
]
解答:
//之前做過(guò)兩個(gè)數(shù)之和等于某個(gè)數(shù)的題目澄港,其實(shí)這題也差不多,三數(shù)之和等于0柄沮,那么我們只要讓另外兩個(gè)數(shù)之和等于第三個(gè)數(shù)的相反數(shù)即可回梧,不過(guò)這里要注意會(huì)存在重復(fù),所以要去重
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
//思路:
vector<vector<int> > ret; // 新建二維數(shù)組
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
int t1=i+1,t2=nums.size()-1;
if(i&&nums[i]==nums[i-1]) // 若原數(shù)組中存在重復(fù)元素祖搓,即i元素等于上一位元素狱意,則下一輪循環(huán)
continue;
while(t1<t2){
if(nums[t1]+nums[t2]==-nums[i]){
vector<int> v; // 新建數(shù)組,每次循環(huán)需重置
v.push_back(nums[i]);
v.push_back(nums[t1]);
v.push_back(nums[t2]);
ret.push_back(v);
++t1;
--t2;
} // 三個(gè)數(shù)的和為0拯欧,即其中兩個(gè)數(shù)的和等于另一個(gè)的相反數(shù)详囤。循環(huán)從頭到尾
else if(nums[t1]+nums[t2]<-nums[i])
++t1;
else
t2--;
}
}
auto pos = unique(ret.begin(),ret.end()); // auto 自動(dòng)推斷類(lèi)型;unique將重復(fù)的放在末位镐作,返回其位置
ret.erase(pos,ret.end()); // 刪除末尾重復(fù)的元素
return ret;
}
};