18. 四数之和
给你一个由 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) {sort(nums.begin(),nums.end());int i=0;int j=nums.size()-1;int left=0;int right=0;long long sum=0;vector<vector<int>> res;for(;i<=j-3;i++){if(i>=1 && nums[i]==nums[i-1]){continue;}for(;j>=i+3;j--){if(j<=nums.size()-2 && nums[j]==nums[j+1]){continue;}left=i+1;right=j-1;sum=nums[i]+nums[j];for(;left<right;){if(sum+nums[left]+nums[right]==target){vector<int> tmp;tmp.push_back(nums[i]);tmp.push_back(nums[j]);tmp.push_back(nums[left]);tmp.push_back(nums[right]);res.push_back(tmp);while(left+1<=right && nums[left+1]==nums[left]){left++;}while(right-1>=left && nums[right-1]==nums[right]){right--;}left++;}else if(sum+nums[left]+nums[right]>target){right--;}else{left++;}} }j=nums.size()-1;}return res;}
};