class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
vector<vector<int>>res;
if(nums.size()<4)
return res;
for(int i=0;i<nums.size()-3;i++){
int a=i;
for(int j=i+1;j<nums.size()-2;j++){
int b=j;
int c=j+1,d=nums.size()-1;
while(c!=d){
if(nums[c]+nums[d]==target-nums[a]-nums[b]){
vector<int>tmp;
tmp.push_back(nums[a]);
tmp.push_back(nums[b]);
tmp.push_back(nums[c]);
tmp.push_back(nums[d]);
sort(tmp.begin(),tmp.end());
if(res.size()>=1&&tmp!=res[res.size()-1])
res.push_back(tmp);
if(res.size()<1)
res.push_back(tmp);
break;
}
else if(nums[c]+nums[d]<-nums[a]-nums[b]){
c++;
}
else d--;
}
}
}
return res;
}
};
四树之和,为什么数据为[-3,-1,0,2,4,5]
2时无结果
去重:如果该数组与上一个相同则不放入
问题出在这里:
if (res.size() >= 1 && tmp != res[res.size() - 1])
res.push_back(tmp);
if (res.size() < 1)
res.push_back(tmp);
这个部分处理了将结果 tmp
加入到结果数组 res
的逻辑。但是,这样的处理方式会导致结果数组中出现重复的解。当程序执行到 res.push_back(tmp);
这里时,不管之前的 res
是否已经有结果,都会将 tmp
加入到 res
中。这样就会导致重复的解出现在结果数组中。
正确的做法应该是在 tmp
加入到 res
之前先进行去重处理,判断 tmp
是否已经在 res
中存在,如果不存在才将其加入。可以通过使用 std::find
函数来实现去重:
if (res.empty() || std::find(res.begin(), res.end(), tmp) == res.end())
res.push_back(tmp);
这样做就可以确保结果数组 res
中不会出现重复的解了。
修正后的代码如下:
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
vector<vector<int>> res;
if (nums.size() < 4)
return res;
for (int i = 0; i < nums.size() - 3; i++) {
for (int j = i + 1; j < nums.size() - 2; j++) {
int c = j + 1, d = nums.size() - 1;
while (c < d) {
if (nums[i] + nums[j] + nums[c] + nums[d] == target) {
vector<int> tmp = {nums[i], nums[j], nums[c], nums[d]};
res.push_back(tmp);
while (c < d && nums[c] == tmp[2]) c++;
while (c < d && nums[d] == tmp[3]) d--;
}
else if (nums[i] + nums[j] + nums[c] + nums[d] < target) {
c++;
}
else {
d--;
}
}
while (j + 1 < nums.size() - 2 && nums[j + 1] == nums[j]) j++;
}
while (i + 1 < nums.size() - 3 && nums[i + 1] == nums[i]) i++;
}
return res;
}
};
不知道你这个问题是否已经解决, 如果还没有解决的话: