Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.
这道题目最主要的关注点:
1. 消除重复pair。
2. 寻找边界条件。
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<int> data;
data.assign(nums.begin(),nums.end());
sort(data.begin(), data.end());
vector<vector<int>> ret;
int len = data.size();
int max = data[len-1]; //use for margin check;
//test margin
if(len < 4) return ret;
for(int i = 0; i< len-3; i++){
if(data[i]*4 > target ) break; //data[i] is too large, needs to stop
if(data[i] + max*3 < target) continue; //data[i] is too small, need to proceed
if(i>0 && data[i] == data[i-1]) continue; //use to eliminate duplicate pairs
for(int j = i+1; j<len-2; j++){
if(data[i] + data[j]*3 > target) break;
if(data[i] + data[j] + 2*max < target) continue;
if(j>i+1 && data[j] == data[j-1]) continue;
int subtar = target - data[i] - data[j];
//Twosum: Two pointer
int start = j+1;
int end = len-1;
if(data[start] + data[start+1] > subtar || data[end] + data[end-1] < subtar) continue;
while(start<end){
int tmp = data[start] + data[end];
if( tmp == subtar){
ret.push_back({data[i],data[j],data[start],data[end]});
while(data[start] == data[start+1] && data[end] == data[end-1] && (start+1) < (end-1)){
start++;
end--;
}//eliminate duplicate pairs.
start++;
end--;
}
else {
if(tmp > subtar) end--;
else start++;
}
}
}
}
return ret;
}
};