一.题目

二.题目分析
给定数组 nums 和目标值 target,寻找所有不重复 的四元组 [nums[a], nums[b], nums[c], nums[d]],满足:
- 下标约束:
0 ≤ a,b,c,d < n,四个下标互不相等 - 数值条件:
nums[a]+nums[b]+nums[c]+nums[d] = target - 结果要求:不能包含重复四元组,返回顺序随意
⚠️ 重点区分:下标不同,但元素组合一样 → 视为重复,需要去重。 例:
[2,2,2,2]只能输出一组答案。
这里的题目分析与前面三数之和的讲解一样
三.算法原理讲解
解法一:暴力枚举 + 去重
这里我就不过多介绍了,可以看上一节的三数之和
解法二:双指针 + 去重
思路与三数之和的思路完全相同,三数之和是固定一个数,利用双指针进行查找,这里也是类似,固定两个数,利用双指针进行查找

这里需要注意的是要进行三次去重
四.编写代码

这里有一个注意的点,红色框里面会出现数据溢出的风险,所以这里需要转化为long long
cpp
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> ret;
sort(nums.begin(), nums.end());
int n = nums.size();
for(int i = 0; i < n - 3;) // 固定数a
{
int a = i;
for(int j = i + 1; j < n - 2;) // 固定数b
{
int b = j, left = j + 1, right = n - 1;
while(left < right)
{
// 注意数据溢出
long long num = (long long)nums[a] + nums[b] + nums[left] + nums[right];
if(num > target)
{
right--;
}
else if(num < target)
{
left++;
}
else
{
ret.push_back({nums[a], nums[b], nums[left], nums[right]});
left++;
right--;
// 去重一
while(left < right && nums[left] == nums[left - 1]) left++;
while(left < right && nums[right] == nums[right + 1]) right--;
}
}
// 去重二
j++;
while(j < n - 2 && nums[j] == nums[j - 1]) j++;
}
// 去重三
i++;
while(i < n - 3 && nums[i] == nums[i - 1]) i++;
}
return ret;
}
};