【优选算法】四数之和
题⽬描述:
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
算法思路:
a. 依次固定⼀个数a;
b. 在这个数a的后⾯区间上,利⽤「三数之和」找到三个数,使这三个数的和等于target- a 即可。
class Solution {
public:
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;)
{
for(int j=i+1;j<n;)
{
int left=j+1,right=n-1;
long long target2=(long long)target-nums[j]-nums[i];
while(left<right)
{
if(nums[left]+nums[right]<target2) left++;
else if(nums[left]+nums[right]>target2) right--;
else{
ret.push_back({nums[i],nums[j],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&&nums[j]==nums[j-1]) j++;
}
i++;
while(i<n&&nums[i]==nums[i-1]) i++;
}
return ret;
}
};