1.题目解析
这里的18.四数之和与之前的三数之和有着异曲同工之妙,所以建议看完三数之和再来看本题,详细题目见Leetcode每日刷题之15.三数之和 ,只不过这里需要寻找的是四元组,也是不能寻找重复的四元组并且四元组内的数字可以按照任意顺序返回
2.算法原理
关于四数之和的思路是首先固定一个数 a,这时利用三数之和的思路找出符合三个数之和为target - a ,在后续的数组范围内固定另一个数 b,然后使用双指针找出符合两数之和为 target - a - b 的二元组即可,然后对双指针找出的二元组去重,再对数字 b 去重,最后对数字 a 去重即可
3.代码展示
cpp
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target)
{
//1.创建二维数存储数据
vector<vector<int>> vv;
//2.排序数组数据
sort(nums.begin(),nums.end());
int n = nums.size();
//固定数 a
for(int i = 0;i < n; )
{
//固定数 b
for(int j = i + 1;j < n; )
{
int left = j + 1;
int right = n - 1;
long long aim = (long long)target - nums[i] - nums[j];
while(left < right)
{
int sum = nums[left] + nums[right];
if(sum < aim)
{
left++;
}
else if(sum > aim)
{
right--;
}
else
{
vv.push_back({nums[i],nums[j],nums[left],nums[right]});
//去重双指针找到的二元组
right--;
left++;
while(left < right && nums[right] == nums[right + 1])
{
right--;
}
while(left < right && nums[left] == nums[left - 1])
{
left++;
}
}
}
//去重 b
j++;
while(j < n && nums[j] == nums[j - 1])
{
j++;
}
}
//去重 a
i++;
while(i < n && nums[i] == nums[i - 1])
{
i++;
}
}
return vv;
}
};