难度中等710收藏分享切换为英文接收动态反馈
给定一个包含 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] ]
通过次数145,753提交次数368,002
解答:三数之和等于0的解答:https://blog.csdn.net/weixin_41579872/article/details/111754233
三数之和最接近target的解答:https://blog.csdn.net/weixin_41579872/article/details/112385680
有了这三个基础,那么这道题目的解答,只是增加一个维度,或者说增加一层循环而已。代码如下:
class Solution {
public:
bool is_element_in_vector(vector<vector<int>> vec, vector<int> element)
{
vector<vector<int>>::iterator it;
it = find(vec.begin(), vec.end(), element);
if (it != vec.end()) {
return true;
}
else {
return false;
}
}
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
vector<vector<int> > reti;
if(nums.size()<=3)
return reti;
for(int m=0;m<nums.size()-3;m++)
{
for(int i=m+1;i<nums.size()-2;i++)
{
int j=i+1,k=nums.size()-1;
while(j<k)
{
int sum=nums[i]+nums[j]+nums[k]+nums[m];
if(sum>target)
k--;
else if(sum<target)
j++;
else
{
vector<int> temp;
temp.push_back(nums[m]);
temp.push_back(nums[i]);
temp.push_back(nums[j]);
temp.push_back(nums[k]);
sort(temp.begin(),temp.end());
if(!is_element_in_vector(reti,temp))
reti.push_back(temp);
//break; //不能break,因为还有可能有其他的组合
k--;
j++;
}
}
}
}
return reti;
}
};
代码中,注释部分是一直没有通过测试用例的原因。
执行结果:
通过
显示详情
执行用时:108 ms, 在所有 C++ 提交中击败了42.45%的用户
内存消耗:15 MB, 在所有 C++ 提交中击败了5.01%的用户