# 18 - 4Sum
解法一 - Two Pointer
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
int n=nums.size();
sort(nums.begin(), nums.end());
vector<vector<int>> quadruplets;
for(int i=0; i<n-3; i++) {
if(i>0 && nums[i-1] == nums[i]) continue;
for(int j=i+1; j<n-2; j++) {
if(j>i+1 && nums[j-1] == nums[j]) continue;
searchPair(nums, target, i, j, quadruplets);
}
}
return quadruplets;
}
private:
void searchPair(vector<int>& nums, int target, int first, int second, vector<vector<int>>& quadruplets) {
int l=second+1, r=nums.size()-1;
while(l<r) {
int sum = nums[first] + nums[second] + nums[l] + nums[r];
if(sum == target) {
quadruplets.push_back({nums[first], nums[second], nums[l], nums[r]});
// Intuitively, we should only do l++ or r--
// so that we won't miss the case of nums[l]+nums[r-1] or nums[l+1]+nums[r]
// But think deeper, if we only do r--
// After preventing duplicates, we know that
// nums[l] and nums[new r] cannot fulfill sum==target
// So we won't miss anything even we do l++ and r--
l++;
r--;
// Need to prevent duplicates
while(l<r && nums[l] == nums[l-1]) l++;
while(r>l && nums[r] == nums[r+1]) r--;
}
else if(sum < target) l++;
else r--;
}
}
};
Last updated