class Solution { public: vector<vector<int> > fourSum(vector<int> &num, int target) { sort(num.begin(),num.end()); vector<vector<int> > res; int* a = &num[0]; int len = num.size(); for (int i = 0; i < len; i++) { if (i > 0 && num[i] == num[i-1]) continue; for (int j = i+1; j < len; j++) { if (j > i+1 && num[j] == num[j-1]) continue; int x = j+1, y = len - 1; while (x < y) { int t = a[i] + a[j] + a[x] + a[y]; if (t == target) { res.push_back({a[i], a[j], a[x], a[y]}); while (x < y && a[x+1] == a[x]) x++; while (x < y && a[y-1] == a[y]) y--; x++; y--; } else if (t > target) { y--; } else { x++; } } } } return res; } };
@2013-10-07
N3
写了个复杂版本的。好处是方便拓展sum(a1...ai)都可以。i=2,3,4,5...
class Solution { public: vector<vector<int> > fourSum(vector<int> &num, int target) { vector<vector<int> > res; int n = num.size(); if (n < 4) return res; sort(num.begin(), num.end()); vector<int> v; gen(num, res, v, target, 0, 4); return res; } void gen(const vector<int>& a,vector<vector<int> >&res, vector<int>& v, int tar, int cur, int total) { if (v.size() == total) return; if (total - v.size() == 2) { int i = cur, j = a.size() - 1; while (i < j) { if (a[i] + a[j] == tar) { v.push_back(a[i]); v.push_back(a[j]); res.push_back(v); v.pop_back(); v.pop_back(); int t = i; while (i < j && a[i] == a[t]) i++; t = j; while (i < j && a[j] == a[t]) j--; } else if (a[i] + a[j] > tar) j--; else i++; } return; } int prev, i = cur; while (i + 3 - v.size() < a.size()) { v.push_back(a[i]); gen(a, res, v, tar - a[i], i+1, total); v.pop_back(); prev = i; while (i < a.size() && a[prev] == a[i]) i++; } } };