Question18–4sum
给定一个包含n个int的数组和一个target,找出四个int,使a+b+c+d=target,并且不能有重复的组。
算法
先对数组排序,从小到大排列。然后找出所有不同的两两组合,并对于每个两两组合,相应的找出其余两个数(假如为a,b),使ab的和等于target减去两两组合。
Code
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int n=nums.size();
vector<vector<int>> r;
for(int i=0; i<n; i++){
if(i>0&&nums[i]==nums[i-1]) continue;
for(int j=i+1; j<n; j++){
if(j>i+1&&nums[j]==nums[j-1]) continue;
int sum=target-nums[i]-nums[j];
int start=j+1;
int end=n-1;
while(start<end){
if(start>j+1&&nums[start]==nums[start-1]){
start++;
continue;
}
if(end<n-1&&nums[end]==nums[end+1]){
end--;
continue;
}
int now=nums[start]+nums[end];
if(now<sum) start++;
else if(now>sum) end--;
else if(now==sum){
vector<int> a(4);
a[0]=nums[i];
a[1]=nums[j];
a[2]=nums[start];
a[3]=nums[end];
r.push_back(a);
start++;
end--;
}
}
}
}
return r;
}
算法复杂度
O(n^3)