题目描述
给定一个包含 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]
]
算法
(三重枚举,无重复构造) $O(n^3)$
- 完全基于 3Sum 算法的思路,排序后再增加一重循环即可。
时间复杂度
- 可以参考 3Sum 的时间复杂度,此题的时间复杂度为 $O(n^3)$
C++代码
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> res;
sort(nums.begin(), nums.end());
int n = nums.size();
for (int i = 0; i < n; i++) {
while (i > 0 && i < n && nums[i] == nums[i - 1])
i++;
for (int j = i + 1; j < n; j++) {
while (j != i + 1 && j < n && nums[j] == nums[j - 1])
j++;
int l = j + 1, r = n - 1;
while (l < r) {
if (nums[i] + nums[j] + nums[l] + nums[r] == target) {
res.push_back({nums[i], nums[j], nums[l], nums[r]});
do { l++; } while (l < r && nums[l - 1] == nums[l]);
do { r--; } while (l < r && nums[r] == nums[r + 1]);
} else if (nums[i] + nums[j] + nums[l] + nums[r] < target) {
do { l++; } while (l < r && nums[l - 1] == nums[l]);
} else {
do { r--; } while (l < r && nums[r] == nums[r + 1]);
}
}
}
}
return res;
}
};
nums如果是{0,0,0,0,0},target为0,会报空指针吧?
说错了,应该是指针越界异常
确实有bug,已修正,感谢