注意因为是通用模板,所以中间有很多难以避免的拷贝,性能最终并不是非常好
三数之和
四数之和
vector<vector<int>> nSumHelper(const vector<int> &nums, vector<int> &before, int n, int target) {
vector<vector<int>> res;
if (n <= 0) {
return res;
}
if (n == 1) {
for (auto value : nums) {
if (value == target) {
res.push_back({value});
}
}
return res;
}
if (n == 2) {
int i = -1;
if (!before.empty()) {
i = before.back();
}
int left = i + 1;
int right = nums.size() - 1;
while (left < right) {
vector<int> temp = before;
int sum = nums[left] + nums[right];
if (sum == target) {
temp.push_back(left);
temp.push_back(right);
vector<int> t;
for (auto index : temp) {
t.push_back(nums[index]);
}
res.push_back(move(t));
++left;
--right;
while (left < right && nums[left] == nums[left - 1]) {
++left;
}
while (left < right && nums[right] == nums[right + 1]) {
--right;
}
continue;
} else if (sum < target) {
++left;
} else {
--right;
}
}
return res;
}
int i = -1;
if (!before.empty()) {
i = before.back();
}
for (int j = i + 1; j < nums.size(); ++j) {
if (j > i + 1 && nums[j] == nums[j - 1]) {
continue;
}
before.push_back(j);
auto r1 = nSumHelper(nums, before, n - 1, target - nums[j]);
if (!r1.empty()) {
for (auto &v : r1) {
res.push_back(v);
}
}
before.pop_back();
}
return res;
}
vector<vector<int>> nSum(vector<int> &nums, int n, int target) {
vector<vector<int>> ans;
if (nums.size() < n) {
return ans;
}
sort(nums.begin(), nums.end());
vector<int> before;
return nSumHelper(nums, before, n, target);
}
/// ===============提交的业务代码=============================
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
return nSum(nums, 4, target);
}
};