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:
- Elements in a quadruplet (a, B, c, d) must be in non-descending order. (ie, a ≤ B ≤ c ≤ d)
- 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
> FourSum (vector
& Num, int target) {std: vector <std: vector
> Ans; if (num. size () <4) {return ans;} sort (num. begin (), num. end (); // after sorting, scanning from left to right; two numbers in the middle, one from left + 1, and the other from right-1 for (int left = 0; left <num. size ()-3;) {for (int right = num. size ()-1; right> left + 2;) {int ml = left + 1; int mr = right-1; while (mr> ml) {int temp = num [left] + num [ml] + num [mr] + num [right]; if (temp> target) {mr --; while (num [mr] = num [mr + 1]) {mr -- ;}} else if (temp <target) {ml ++; while (num [ml] = num [ml-1]) {ml ++ ;}} else {std: vector
Temp; temp. push_back (num [left]); temp. push_back (num [ml]); temp. push_back (num [mr]); temp. push_back (num [right]); ans. push_back (temp); mr --; ml ++; while (ml <mr & num [mr] = num [mr + 1]) {mr --;} while (ml <mr & num [ml] = num [ml-1]) {ml ++ ;}} right --; while (left <right & num [right] = num [right + 1]) {right -- ;}} left ++; while (num [left] = num [left-1]) {left ++ ;}} return ans ;}};