4 Pointer solution. Key: when moving pointers, we skip duplicated ones.
Ref: https://github.com/xbz/lintcode/blob/master/4_sum/4sum.cpp

class Solution { void nextUnique(vector<int> &num, size_t &j) { while (j<num.size() && num[j]==num[j-1]) ++j; } public: vector<vector<int> > fourSum(vector<int> &num, int target) { vector<vector<int> > ret; sort(num.begin(), num.end()); for (size_t i=0; i<num.size(); ++i) { if(i > 0) nextUnique(num, i); for (size_t j=i+1; j<num.size(); ++j) { if(j>i + 1) nextUnique(num, j); size_t m = j + 1; size_t n = num.size() - 1; while (m < n) { int sum = num[i] + num[j] + num[m] + num[n]; if (sum == target) { vector<int> v = {num[i], num[j], num[m], num[n]}; ret.push_back(v); m++; n--; if(m>j+1) nextUnique(num, m); while (n<num.size()-1 && m<n && num[n]==num[n+1]) n--; } else if (sum < target) ++m; else --n; } } } return ret; } };