> 文档中心 > 18. 四数之和 - 力扣(LeetCode)(双指针、枚举)

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;    }};

家庭教育网