15.三数之和
题目:15.三数之和
在两数之和的基础上实现,先枚举x在进行目标值为target-x的两数之和。注意要去除重复的x和重复的y,z。当然也可以使用set集合的互异性来去重。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
//先进行排序,便于去除重复x,y,z
sort(nums.begin(),nums.end());
//nums.rbegin(),nums.rend()可实现反向排序
for(int i=0;i<nums.size();i++){//枚举x
if(i>0&&nums[i]==nums[i-1])continue;//此处是为了去除重复的x 剪枝
int left=i+1,right=nums.size()-1;//取左右端点。
//-4 -1 -1 0 1 2
while(left<right){
int sum=nums[left]+nums[right]+nums[i];
if(sum==0){
ans.push_back({nums[left],nums[right],nums[i]});
right--;left++;
while(left<right&&nums[left]==nums[left-1])left++;//去除相同的y 剪枝
while(left<right&&nums[right]==nums[right+1])right--;//去除相同的z 剪枝
}
else if(sum>0)right--;
else left++;
}
}
return ans;
}
};
假设使用set集合的话,需要对ans(set<vector

class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
set<vector<int>> ans;
vector<vector<int>> realAns;
sort(nums.begin(),nums.end());
//nums.rbegin(),nums.rend()可实现反向排序
for(int i=0;i<nums.size();i++){//枚举x
int left=i+1,right=nums.size()-1;//取左右端点。
//-4 -1 -1 0 1 2
while(left<right){
int sum=nums[left]+nums[right]+nums[i];
if(sum==0){
vector<int> temp={nums[left],nums[right],nums[i]};
ans.insert(temp);
right--;left++;
}
else if(sum>0)right--;
else left++;
}
}
for(auto c:ans){
realAns.push_back(c);
}
return realAns;
}
};

浙公网安备 33010602011771号