18. 4Sum(双指针 注意答案去重)
Given an array nums
of n integers and an integer target
, are there elements a, b, c, and d in nums
such that a + b + c + d = target
? Find all unique quadruplets in the array which gives the sum of target
.
Note:
The solution set must not contain duplicate quadruplets.
Example:
Given array nums = [1, 0, -1, 0, -2, 2], and target = 0. A solution set is: [ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ]
class Solution: def fourSum(self, nums: List[int], target: int) -> List[List[int]]: nums = sorted(nums) n = len(nums) res = [] for i in range(n-3): if i>0 and nums[i]==nums[i-1]: continue for j in range(i+1,n-2): if j > i+1 and nums[j] == nums[j-1]: continue l = j+1 r = n-1 while l < r: cur = nums[i]+nums[j]+nums[l]+nums[r] if cur > target: r-=1 elif cur < target: l+=1 else: res.append([nums[i],nums[j],nums[l],nums[r]]) while l < r and nums[l]==nums[l+1]:l+=1 while l < r and nums[r]==nums[r-1]:r-=1 l+=1 r-=1 return res
1 class Solution { 2 public: 3 vector<vector<int>> fourSum(vector<int>& nums, int target) { 4 vector<vector<int>> res; 5 if(nums.size() < 4) return res; 6 sort(nums.begin(),nums.end()); 7 for(int i = 0;i < nums.size() - 3;++i) { 8 if (i!=0 && nums[i]==nums[i-1]) continue; // 去重 9 for(int j = i+1;j < nums.size() -2;++j) { 10 if(j!= i+1 && nums[j]==nums[j-1]) continue;//去重 11 int low = j + 1; 12 int high = nums.size() -1; 13 while(low < high) { 14 int sum = nums[i] + nums[j] + nums[low] + nums[high]; 15 if (sum == target) { 16 res.emplace_back(vector<int>({nums[i],nums[j],nums[low],nums[high]})); 17 while(low < high && nums[low]==nums[low+1]) low++; // 去重 18 while(low < high && nums[high]==nums[high-1]) high--; // 去重 19 high--; 20 low++; 21 } else if (sum > target) { 22 high--; 23 } else if (sum < target) { 24 low++; 25 } 26 } 27 } 28 } 29 return res; 30 } 31 };
1 class Solution { 2 public List<List<Integer>> fourSum(int[] nums, int target) { 3 List<List<Integer>> res = new LinkedList<>(); 4 if (nums.length<4) return res; 5 Arrays.sort(nums); 6 for(int i=0;i<nums.length-3;i++){ 7 if(i>0&&nums[i]==nums[i-1]) continue; 8 for(int j=i+1;j<nums.length-2;j++){ 9 if(j>i+1&&nums[j]==nums[j-1]) continue; 10 11 int lo = j+1,hi = nums.length-1; 12 while(lo<hi){ 13 int sum = nums[i]+nums[j]+nums[lo]+nums[hi]; 14 if(sum==target){ 15 res.add(Arrays.asList(nums[i],nums[j],nums[lo],nums[hi])); 16 17 //答案去重 18 while(lo<hi&&nums[lo]==nums[lo+1]) lo++; 19 while(lo<hi&&nums[hi]==nums[hi-1]) hi--; 20 21 lo++; 22 hi--; 23 } 24 25 else if(sum<target) lo++; 26 else hi--; 27 } 28 29 } 30 } 31 return res; 32 } 33 }