题目描述
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/4sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例
输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
分析
- 这个和三数之和的解法可以一模一样,就是再套一层,实际跑下来结果也还可以,击败了80%。
上代码
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> out;
//1.排序
sort(nums.begin(),nums.end());
int pre;
for(int i=0;i < int(nums.size()) - 3;++i)
{
if(i != 0 && pre == nums[i])
{
continue;
}
pre = nums[i];
int pre_j;
//2. three sum
for(int j = i + 1;j < int(nums.size()) - 2 ; ++j)
{
if(j != i + 1 && pre_j == nums[j])
{
continue;
}
pre_j = nums[j];
int pre_p1;
int pre_p2;
int p1 = j + 1, p2 = nums.size() - 1;
//3.two sum
int v = target - nums[j] - nums[i];
bool flag = false;
while(p1 < p2)
{
int twosum = nums[p1] + nums[p2];
if(twosum == v)
{
if( !flag || pre_p1 != nums[p1] || pre_p2 != nums[p2])
{
out.push_back({
nums[i],nums[j],nums[p1],nums[p2]});
pre_p1 = nums[p1];
pre_p2 = nums[p2];
flag = true;
}
}
if(twosum > v)
{
--p2;
}else
{
++p1;
}
}
}
}
return out;
}
};