四数之和
给你一个由 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
你可以按 任意顺序 返回答案 。
题解
此题和 三数之和 做法思路相似
都是先考虑去重四元组,然后使用双指针枚举出符合要求的四元组
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 && 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 k=j+1,l=nums.size()-1; k<l; ++k){
//利用双指针进行优化时间复杂度
if(k>j+1 && nums[k]==nums[k-1]) continue; //去重
while((long long)nums[i]+nums[j]+nums[k]+nums[l-1]>=target && k<l-1) l--;
if((long long)nums[i]+nums[j]+nums[k]+nums[l] == target){
ans.push_back({nums[i], nums[j], nums[k], nums[l]});
}
}
}
}
return ans;
}
};