此题是三数之和的升级版,相比三数之和细节更多。
首先,还是三数之和的套路,数越多越只能暴力,比起三数之和就是加了层循环。然后就是剪枝,在外层循环中,如果碰到之前见过的数,就一定要剪枝。
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> ans;
int n = nums.size();
sort(nums.begin(), nums.end());
for(int l1=0;l1<n;l1++)
{
if(l1 > 0 && nums[l1] == nums[l1-1])continue;
for(int l2=l1+1;l2<n;l2++)
{
if(l2 > l1+1 && nums[l2] == nums[l2-1])continue;
int r1 = l2+1, r2 = n-1;
while(r1 < r2)
{
int val = nums[l1]+nums[l2]+nums[r1]+nums[r2];
if(val > target)r2--;
else if(val < target)r1++;
else
{
while(r1 < r2 && nums[r1] == nums[r1+1])r1++;
while(r1 < r2 && nums[r2] == nums[r2-1])r2--;
ans.push_back(vector<int>{nums[l1], nums[l2], nums[r1], nums[r2]});
r1++; r2--;
}
}
}
}
return ans;
}
};