[leetcode] Combination Sum IV

本文介绍了一种使用记忆化搜索方法解决组合问题的算法实现。通过对输入数组进行排序并利用辅助数组记录中间结果的方式,有效地减少了重复计算,提高了求解以特定值开始的组合数目问题的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:记忆化搜索,定义函数查找以index开始,值为target的个数,顺便对nums排序减少不必要的搜索。

代码如下:

class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        int result = 0;
        if(nums.empty() || target == 0) return result;
        sort(nums.begin(), nums.end());
        vector<vector<int> > path(nums.size(), vector<int>(target + 1, -1));
        for(int i = 0; i < nums.size(); ++i)
            result += get(i, target, path, nums);
        return result;
    }
private:
    int get(int index, int target, vector<vector<int> > &path, vector<int>& nums) {
        if(target == nums[index]) path[index][target] = 1;
        if(target < nums[index]) path[index][target] = 0;
        if(path[index][target] != -1)
            return path[index][target];
        int cnt = 0;
        target -= nums[index];
        for(int i = 0; i < nums.size(); ++i)
            cnt += get(i, target, path, nums);
        path[index][target + nums[index]] = cnt;
        return cnt;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值