18.四数之和
思路1:暴力法
四重for循环,不做实现了吧,估计也不好去重
思路2:两层循环+双指针
因为要用双指针,排序必不可少,先sort一下,然后遍历前两个值,对后两个值双指针
ac代码如下:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>>result;
int n=nums.size();
sort(nums.begin(), nums.end());
if(n<4)
return result;
for(int i=0;i<n-3;i++){
for(int j=i+1;j<n-2;j++){
int p1=j+1;
int p2=n-1;
int sum1=nums[i]+nums[j];
if(i>0&&nums[i]==nums[i-1])
continue;
if(j>i+1&&nums[j]==nums[j-1])
continue;
while(p1<p2){
int sum=sum1+nums[p1]+nums[p2];
if(sum<target)
p1++;
if(sum>target)
p2--;
if(sum==target){
result.push_back({nums[i],nums[j],nums[p1],nums[p2]});
while(p1<p2&&nums[p1+1]==nums[p1])
p1++;
while(p1<p2&&nums[p2-1]==nums[p2])
p2--;
p1++;
p2--;
}
}
}
}
return result;
}
对比三数之和
感觉没啥区别,重点还是在去重