Leetcode-18-四数和为K
题目链接
题目描述
一个 n 个整数组成的数组 nums ,和一个目标值 K。
找出满足下述条件且不重复的四元组
nums[a] + nums[b] + nums[c] + nums[d] == K
思路
是三个数和为0的进阶版。
思路是一样的,知识多一层循环, 时间复杂度O(n^3)。
- 排序,方便跳过重复的解
- 双层循环确定前两个数,nuns[i] nums[j]
- 双指针 L=j+1, R=n-1,确定而后两个数。
- 和 > K: R--
- 和 < K: L++
C++代码
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> ans;
int n = nums.size();
sort(nums.begin(),nums.end());
long long T;
int L, R, T1, T2;
for (int i = 0; i < n-3; i++)
{
if (i!=0 && nums[i]==nums[i-1]) continue;
T1 = nums[i];
for (int j = i+1; j < n-2; j++)
{
if (j!=i+1 && nums[j]==nums[j-1]) continue;
T2 = nums[j];
L=j+1, R=n-1;
while (L < R)
{
T = (long long)T1+T2+nums[L]+nums[R];
if (T == target)
{
ans.push_back({T1,T2,nums[L],nums[R]});
L++, R--;
while (L<R && nums[L]==nums[L-1]) L++;
}
else if (T > target)
R--;
else
L++;
}
}
}
return ans;
}
};