18. 四数之和 - 力扣(LeetCode)(双指针、枚举)
四数之和
给你一个由 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; }};