力扣18. 四数之和
题目来源(力扣):
https://leetcode.cn/problems/4sum/description/
题目描述:
在1个数组中找到4个元素,使得4个元素的和为target,返回所有的符合条件的4元组。
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
基本思路:
和力扣15. 三数之和做法相同,可见 https://www.cnblogs.com/hb-computer/articles/18493706
只是在此基础上多了一层循环,参考《代码随想录》中的写法,如下:
代码实现:
class Solution
{
public:
vector<vector<int>> fourSum(vector<int> &nums, int target)
{
vector<vector<int>> ans;
sort(nums.begin(), nums.end()); // 先排序
for (int i = 0; i < nums.size(); i++)
{
if (i > 0 && nums[i] == nums[i - 1])
continue; // 对第一个数去重
for (int j = i + 1; j < nums.size(); j++)
{
if (j > i + 1 && nums[j] == nums[j - 1])
continue; // 对第二个数去重
for (int left = j + 1, right = nums.size() - 1; left < right;)
{
long long val = (long long)nums[i] + nums[j] + nums[left] + nums[right];
if (val > target)
right--;
else if (val < target)
left++;
else
{
ans.push_back({nums[i], nums[j], nums[left], nums[right]}); // 每个nums[] 都在int范围内,但是他们的和可能超出int范围
while (left < right && nums[left] == nums[left + 1])
left++;
while (left < right && nums[right] == nums[right - 1])
right--;
left++, right--;
}
}
}
}
return ans;
}
};
时间复杂度
O(n^3)
浙公网安备 33010602011771号