注意因为是通用模板,所以中间有很多难以避免的拷贝,性能最终并不是非常好
三数之和
四数之和
vector> nSumHelper(const vector &nums, vector &before, int n, int target) { vector > 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 temp = before; int sum = nums[left] + nums[right]; if (sum == target) { temp.push_back(left); temp.push_back(right); vector 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 > nSum(vector &nums, int n, int target) { vector > ans; if (nums.size() < n) { return ans; } sort(nums.begin(), nums.end()); vector before; return nSumHelper(nums, before, n, target); } /// ===============提交的业务代码============================= class Solution { public: vector > fourSum(vector & nums, int target) { return nSum(nums, 4, target); } };



