给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:
答案中不可以包含重复的四元组。
这里需要考虑去重。
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> output;
// 先排序
std::sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size();) {
for (int j = i + 1; j < nums.size();) {
int p1 = j + 1, p2 = nums.size() - 1;
while (p1 < p2) {
int sum = target - nums[i] - nums[j];
if (nums[p1] + nums[p2] < sum) p1++;
else if (nums[p1] + nums[p2] > sum) p2--;
else {
output.push_back({ nums[i], nums[j], nums[p1], nums[p2] });
int tmp1 = nums[p1++];
int tmp2 = nums[p2--];
while(p1 < p2 && nums[p1] == tmp1 && nums[p2] == tmp2){
p1++; p2--;
}
}
}
int tmpj = nums[j];
while (++j < nums.size() && nums[j] == tmpj);
}
int tmpi = nums[i];
while (++i < nums.size() && nums[i] == tmpi);
}
return output;
}

本文深入探讨了如何寻找数组中是否存在四个数的和等于给定目标值的问题,通过详细的算法实现,展示了如何有效地找到所有可能的四元组合,并确保结果中没有重复的组合。文章重点介绍了使用排序和双指针技巧来优化搜索过程,减少计算复杂度。
507

被折叠的 条评论
为什么被折叠?



