题目描述:

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:
答案中不可以包含重复的四元组。
示例:
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
满足要求的四元组集合为:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]

算法思想:此题目思想跟​​三数之和​​一致,只不过需要注意一些剪枝的情况,如果直接暴力求解会超时。

class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> res;
if(nums.size()<4)
return res;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size()-3;i++){
//题目要求不能有重复的四元组,所以如果有相同的元素,选择最后一个元素
if(i>0&&nums[i]==nums[i-1]) continue;
if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target)
break;
if(nums[i]+nums[nums.size()-1]+nums[nums.size()-2]+nums[nums.size()-3]<target)
continue;
for(int j=i+1;j<nums.size()-2;j++){
if(j>i+1&&nums[j]==nums[j-1]) continue;
if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target)
break;
if(nums[i]+nums[j]+nums[nums.size()-1]+nums[nums.size()-2]<target)
continue;
int start=j+1;
int end=nums.size()-1;
while(start<end){
int sum=nums[i]+nums[j]+nums[start]+nums[end];
if(sum==target){
vector<int> temp(4,0);
temp[0]=nums[i];
temp[1]=nums[j];
temp[2]=nums[start];
temp[3]=nums[end];
res.push_back(temp);
while(start<end&&nums[start]==nums[start+1])
start++;
while(start<end&&nums[end]==nums[end-1])
end--;
}
if(sum>target)
end--;
else
start++;
}
}
}
return res;
}
};

LeetCode_18. 四数之和_数组