栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++ n-sum通用模板

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++ n-sum通用模板

注意因为是通用模板,所以中间有很多难以避免的拷贝,性能最终并不是非常好
三数之和
四数之和

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);
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/396112.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号