题目要点
- 给定一个整数数组
nums和目标值target,找出所有不重复的四元组[a, b, c, d],使得a + b + c + d == target。 - 结果中不能有重复四元组。
核心思路
- 先对数组排序。
- 固定前两个数
nums[i]、nums[j]。 - 剩下两个数用双指针
left、right在有序数组中夹逼查找。 - 遇到命中结果时,把四元组加入答案,并跳过重复值。
为什么这样做
- 排序后可以用双指针把四数之和降成三层结构:
i、j枚举,left/right收缩。 - 相比暴力四重循环,复杂度从
O(n^4)降到O(n^3)。
关键实现细节
- 使用
long long计算和,避免四个int相加溢出。 - 数组长度小于 4 时直接返回空结果。
- 去重规则:
i > 0 && nums[i] == nums[i - 1]时跳过。j > i + 1 && nums[j] == nums[j - 1]时跳过。- 找到答案后,
left和right都要跳过重复值。
常见坑
- 返回类型必须是
vector<vector<int>>,不能误写成vector<string>。 - 结果里保存的是四个整数,不要拼成字符串。
- 不能直接用
nums.size() - 3之类的表达式而不做长度判断,短数组时容易出问题。 - 求和一定要防溢出,尤其是数据范围较大时。
复杂度
- 时间复杂度:
O(n^3) - 空间复杂度:
O(1),不算输出结果
1 |
|