LeetCode刷题——组合总和 Ⅳ#377#Medium

本文探讨了如何使用动态规划和记忆化搜索方法解决组合总和IV的问题,给出了Java和Python两种实现。动态规划方法中,初始化动态规划数组,通过遍历数组更新每个状态的和。记忆化搜索方案中,利用递归和记忆化数组减少重复计算。虽然Python版本速度一般,但仍有优化空间。
摘要由CSDN通过智能技术生成

组合总和 Ⅳ的思路探讨与源码
    组合总和 Ⅳ的题目如下图,该题属于数组类和动态规划类型的题目,主要考察对于动态规划方法的使用和数组结构的理解。本文的题目作者想到2种方法,分别是记忆化搜索方法和动态规划方法,其中动态规划方法使用Java进行编写,而记忆化搜索方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
在这里插入图片描述
    本人认为该题目可以使用动态规划方法的思路进行解决,首先初始化一个动态规划数组,并把第一个元素赋值为1,然后开始遍历循环,对数组的每一个元素都进行判断,如果元素值小于等于动态规划的数组下标,那么就把动态规划当前的元素值和下标差值的元素值求和后赋予给当前动态规划数组的元素值,直到循环遍历结束,并返回动态规划的目标位的元素值,那么按照这个思路我们的Java代码如下:

#喷火龙与水箭龟
class Solution {
    public int combinationSum4(int[] nums, int target) {
        int[] arr = new int[target + 1];
        arr[0] = 1;
        for (int ir = 1; ir <= target; ir++) {
            for (int numPer : nums) {
                if (numPer <= ir) {
                    arr[ir] = arr[ir] + arr[ir - numPer];
                }
            }
        }
        return arr[target];
    }
}

在这里插入图片描述
    显然,我们的动态规划方法的效果还不错,还可以使用记忆化搜索的方法解决。首先判断目标值是否小于0,如果是则直接返回0的结果;如果目标值对应的数组值不等于-1就直接返回结果。然后开始遍历循环,将每个元素的值进行记忆化搜索并进行求和计算,直到遍历结束并返回结果。而主函数是初始化参数并进行记忆化搜索,直到搜索结束并返回最终结果。所以按照这个思路就可以解决,下面是Python代码:

#喷火龙与水箭龟
class Solution(object):
    def combinationSum4(self, nums, target):
        self.dp = [-1] * (target + 1)
        self.dp[0] = 1
        return self.dfsSearch(nums, target)

    def dfsSearch(self, nums, target):
        if(target < 0):
            return 0
        if(self.dp[target] != -1):
            return self.dp[target]
        resFinal = 0
        for numPer in nums:
            resFinal = resFinal + self.dfsSearch(nums, target - numPer)
        self.dp[target] = resFinal
        return resFinal

在这里插入图片描述
    从结果来说Java版本动态规划方法的效率不错,而Python版本的记忆化搜索方法的速度比较一般,但应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值