【leetcode】4Sum
Question:
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)
Anwser 1:
O(n^3)
class Solution { public: vector<vector<int> > fourSum(vector<int> &num, int target) { // Start typing your C/C++ solution below // DO NOT write int main() function int len = num.size(); vector< vector<int> > ret; if(len < 4) return ret; vector<int> num2; num2.assign(num.begin(), num.end()); sort(num2.begin(), num2.end()); vector<int> tmpRet(4); tmpRet[0] = num2[0] - 1; for(int i = 0; i < len - 3; i++){ if(tmpRet[0] == num2[i]) continue; tmpRet[0] = num2[i]; tmpRet[1] = num2[i+1] - 1; for(int j = i + 1; j < len - 2; j++){ if(tmpRet[1] == num2[j]) continue; tmpRet[1] = num2[j]; int l = j + 1; int r = len - 1; while(l < r){ if(tmpRet[0] + tmpRet[1] + num2[l] + num2[r] == target){ tmpRet[2] = num2[l]; tmpRet[3] = num2[r]; ret.push_back(tmpRet); while(num2[++l] == num2[l-1] && l < r); while(num2[--r] == num2[r+1] && l < r); } else if(tmpRet[0] + tmpRet[1] + num2[l] + num2[r] < target){ l++; } else { r--; } } } } } };
参考推荐:
原文: 【leetcode】4Sum
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2013-04-12 22:45:37
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!
转载注明: 【leetcode】4Sum (米扑博客)