18. 4Sum
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] ]
class Solution { public: vector<vector<int>> fourSum(vector<int>& nums, int target) { sort(nums.begin(),nums.end()); vector<vector<int>> ans; int n = nums.size(); for(int i = 0; i < n; i++) { for(int j = i + 1; j < n; j++) { int l = j + 1, r = n - 1; while(l < r) { if(nums[i] + nums[j] + nums[l] + nums[r] < target) l++; else if(nums[i] + nums[j] + nums[l] + nums[r] > target) r--; else { vector<int> v = {nums[i], nums[j], nums[l], nums[r]}; ans.push_back(v); while(l < r && nums[l] == nums[l + 1]) l ++; while(l < r && nums[r] == nums[r - 1]) r --; l ++, r --; } } while(j + 1 < n && j + 2 < n && nums[j + 1] == nums[j]) j ++; } while(i + 1 < n && i + 2 < n && i + 3 < n && nums[i + 1] == nums[i]) i ++; } return ans; } };