本题要求如下:
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)本题我依然是仿照2sum, 3sum这些题的方法,区别就是在3sum的基础上再套一层循环,就是外层循环,
第一层是循环a,第二层是循环b,第三层是while循环,把c置于b的后一位,d置于最高位置。然后逐步逼近。。
代码如下:
class Solution {
public:
vector<vector<int> > fourSum(vector<int> &num, int target) {
vector<vector<int>> retVal;
int n = num.size();
sort(num.begin(), num.end());
for (int i = 0; i < n - 3; ++i) {
while (i > 0 && num[i-1] == num[i])
++i;
for (int j = i + 1; j < n - 2; ++j) {
while (j > (i + 1) && num[j] == num[j-1])
++j;
int low = j + 1;
int high = n - 1;
while (low < high) {
int val = num[i] + num[j] + num[low] + num[high];
if (val == target) {
vector<int> quadruplet;
quadruplet.push_back(num[i]);
quadruplet.push_back(num[j]);
quadruplet.push_back(num[low]);
quadruplet.push_back(num[high]);
retVal.push_back(quadruplet);
do {
--high;
} while (num[high] == num[high+1]);
do {
++low;
} while (num[low] == num[low-1]);
}
else if (val > target) {
do {
--high;
} while (num[high] == num[high+1]);
}
else {
do {
++low;
} while (num[low] == num[low-1]);
}
}
}
}
return retVal;
}
};
这个算法的时间复杂度是O(N^3),我看讨论区有人用hashtable做出了O(N^2 * logN)的时间复杂度,不过我现在刷题的目的是尽量在2月底刷到leetcode130到Easy+medium刷完,开始正式面试,剩下的慢慢刷,如果这题用hashtable,感觉就有hard的难度了,准备到时再深究。。