Question:
Given an array S of n integers, are there elements a, b, c, and d in S 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.
For example, given array S = [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]]
Algorithm:
先排序,兩層迴圈確定兩個數nums[i],nums[j],然後用兩個指標m,n從i+1往後,nums.size()往前搜尋
注意,遍曆過程中,遇到重複的要往後移 Accepted Code:
class Solution {public: vector<vector<int>> fourSum(vector<int>& nums, int target) { vector<vector<int>> res; if(nums.size()<4)return res; sort(nums.begin(),nums.end()); for(int i=0;i<nums.size()-3;i++) { if(i>0&&nums[i]==nums[i-1]) continue; for(int j=i+1;j<nums.size()-2;j++) { if(j>(i+1)&&nums[j]==nums[j-1]) continue; int m=j+1; int n=nums.size()-1; while(m < n) { if(m>(j+2)&&nums[m]==nums[m-1]) { m++; continue; } if(n<(nums.size()-1)&&nums[n]==nums[n+1]) { n--; continue; } int sum=nums[i]+nums[j]+nums[m]+nums[n]; if(sum==target) { vector<int> tmp={nums[i],nums[j],nums[m],nums[n]}; res.push_back(tmp); m++; n--; } else if(sum>target) n--; else m++; } } } return res; }};