classSolution{public:vector<vector<int>>fourSum(vector<int>&nums,inttarget){vector<vector<int>>ans;vector<int>path;sort(begin(nums),end(nums));nSum(nums,4,target,0,nums.size()-1,path,ans);returnans;}private:// In [l, r], find n numbers add up to the targetvoidnSum(constvector<int>&nums,longn,longtarget,intl,intr,vector<int>&path,vector<vector<int>>&ans){if(r-l+1<n||target<nums[l]*n||target>nums[r]*n)return;if(n==2){// Very simliar to the sub procedure in 15. 3Sumwhile(l<r){constintsum=nums[l]+nums[r];if(sum==target){path.push_back(nums[l]);path.push_back(nums[r]);ans.push_back(path);path.pop_back();path.pop_back();++l;--r;while(l<r&&nums[l]==nums[l-1])++l;while(l<r&&nums[r]==nums[r+1])--r;}elseif(sum<target){++l;}else{--r;}}return;}for(inti=l;i<=r;++i){if(i>l&&nums[i]==nums[i-1])continue;path.push_back(nums[i]);nSum(nums,n-1,target-nums[i],i+1,r,path,ans);path.pop_back();}}};
classSolution{publicList<List<Integer>>fourSum(int[]nums,inttarget){List<List<Integer>>ans=newArrayList<>();Arrays.sort(nums);nSum(nums,4,target,0,nums.length-1,newArrayList<>(),ans);returnans;}// In [l, r], find n numbers add up to the targetprivatevoidnSum(int[]nums,longn,longtarget,intl,intr,List<Integer>path,List<List<Integer>>ans){if(r-l+1<n||target<nums[l]*n||target>nums[r]*n)return;if(n==2){// Very simliar to the sub procedure in 15. 3Sumwhile(l<r){finalintsum=nums[l]+nums[r];if(sum==target){path.add(nums[l]);path.add(nums[r]);ans.add(newArrayList<>(path));path.remove(path.size()-1);path.remove(path.size()-1);++l;--r;while(l<r&&nums[l]==nums[l-1])++l;while(l<r&&nums[r]==nums[r+1])--r;}elseif(sum<target){++l;}else{--r;}}return;}for(inti=l;i<=r;++i){if(i>l&&nums[i]==nums[i-1])continue;path.add(nums[i]);nSum(nums,n-1,target-nums[i],i+1,r,path,ans);path.remove(path.size()-1);}}}