【LeetCode-18】四数之和

问题

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:答案中不可以包含重复的四元组。

示例

输入: nums = [1,0,-1,0,-2,2], target = 0
输出: [[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

解答

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        sort(nums.begin(), nums.end());
        return nSum(nums, 4, 0, target);
    }
private:
    vector<vector<int>> nSum(vector<int>& nums, int n, int pos, int target) {
        int sz = nums.size();
        vector<vector<int>> res;
        if (sz < n) return res;
        if (n == 2) {
            int lo = pos, hi = sz - 1;
            while (lo < hi) {
                int left = nums[lo], right = nums[hi];
                int sum = left + right;
                if (sum < target) {
                    while (lo < hi && nums[lo] == left) lo++;
                } else if (sum > target) {
                    while (lo < hi && nums[hi] == right) hi--;
                } else {
                    res.push_back({nums[lo], nums[hi]});
                    while (lo < hi && nums[lo] == left) lo++;
                    while (lo < hi && nums[hi] == right) hi--;
                }
            }
        } else {
            for (int i = pos; i < sz; i++) {
                vector<vector<int>> ans = nSum(nums, n - 1, i + 1, target - nums[i]);
                for (auto& v : ans) {
                    v.push_back(nums[i]);
                    res.push_back(v);
                }
                while (i < sz - 1 && nums[i] == nums[i + 1]) i++;
            }
        }
        return res;
    }
};

重点思路

上面给出的解法可以解决nSum问题(n > 1)。使用递归的方法,将nSum逐步缩小为2Sum,再用2Sum的解法解决该问题。

posted @ 2021-04-02 10:00  tmpUser  阅读(46)  评论(0编辑  收藏  举报