Leetcode: 18. 4Sum 四数之和
问题描述
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.
Note: The solution set must not contain duplicate quadruplets.
Example:
Given array S = [1, 0, -1, 0, -2, 2], and target = 0.
A solution set is: [ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ]
该题是3Sum的进阶版,从3个数变成4个数。
本题传送门 / 3Sum传送门
解决方案
和我的3Sum做法(传送门)相似,也是先排序再夹逼,注意排除不可能的情况。
时间复杂度:O(n^3),空间复杂度:O(1),运行时间:16ms,超过85.58% 的方案 !
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> result;
int N=nums.size();
if(N<4) return result;
sort(nums.begin(),nums.end());
for(int a=0;a<N-3;a++){
if(a>0 && nums[a]==nums[a-1])continue;//跳过重复
if(nums[a]+nums[a+1]+nums[a+2]+nums[a+3]>target)break;//太大了
if(nums[a]+nums[N-3]+nums[N-2]+nums[N-1]<target)continue;//太小了
for(int b=a+1;b<N-2;b++){
if(b>a+1 && nums[b]==nums[b-1])continue;//跳过重复
if(nums[a]+nums[b]+nums[b+1]+nums[b+2]>target)break;//太大了
if(nums[a]+nums[b]+nums[N-2]+nums[N-1]<target)continue;//太小了
int c=b+1,d=N-1;
while(c<d){
int sum=nums[a]+nums[b]+nums[c]+nums[d];
if(sum>target){
do{d--;}while(c<d && nums[d]==nums[d+1]);//跳过重复
}else if(sum<target){
do{c++;}while(c<d && nums[c]==nums[c-1]);//跳过重复
}else{
result.push_back({nums[a],nums[b],nums[c],nums[d]});//得到一个解
do{d--;}while(c<d && nums[d]==nums[d+1]);//跳过重复
do{c++;}while(c<d && nums[c]==nums[c-1]);//跳过重复
}
}
}
}
return result;
}
};