武汉科技有限公司 网站建设快手作品推广网站
题⽬描述:
给你一个由 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;}
};