题目解析
18. 四数之和
这道题的思路和三数之和的思路相同,都是固定一个数,然后在剩下的区间中寻找和为目标值的元组,其次最重要的是要进行去重
算法讲解
1. 完成排序
2. 固定一个数,求剩下区间中三元组的和等于 target - nums[i]
代码编写
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums, long long temp)
{
int n = nums.size();
vector<vector<int>> ret;
// 确定一个数字 寻找其他区间的两数之和
for (int i = 0; i < n; i++)
{
// 对i去重
if (i != 0 && nums[i] == nums[i - 1])
continue;
int left = i + 1;
int right = n - 1;
long long target = temp - nums[i]; // 寻找两数之和的target
while (left < right)
{
if (nums[left] + nums[right] == target)
{
ret.push_back({ nums[left], nums[right], nums[i] });
left++;
right--;
// 对 双指针 去重
while (left < right && nums[left - 1] == nums[right])
{
left++;
}
while (right > left && nums[right + 1] == nums[right])
{
right--;
}
}
else if (nums[left] + nums[right] > target)
{
right--;
}
else
left++;
}
}
return ret;
}
vector<vector<int>> fourSum(vector<int>& nums, int target) {
// 排序
sort(nums.begin(), nums.end());
vector<vector<int>> ret;
int n = nums.size();
for (int i = 0; i < n; ) {
vector<vector<int>> temp_ret;
// 确定一个数 求出剩下的三元组 //需要将剩下的数组传递过去
long long temp = target - nums[i];
vector<int> temp_nums(nums.begin() + i + 1, nums.end());
// 寻找数组中三元组中和等于temp的
temp_ret = threeSum(temp_nums, temp);
//完成四元组
for (auto& v : temp_ret)
{
v.push_back(nums[i]);
ret.push_back(v);
}
//去重
i++;
while (i < n && nums[i] == nums[i - 1])
{
i++;
}
}
return ret;
}
};