LeetCode刷题——零钱兑换#322#Medium

零钱兑换题目的思路探讨与源码
    零钱兑换的题目如下图,该题属于动态规划和搜索类型的题目,主要考察对于动态规划和搜索方法的使用和理解。本文的题目作者想到2种方法,分别是动态规划方法和有记忆搜索法,其中有记忆搜索方法使用java进行编写,而动态规划法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
在这里插入图片描述
    本人认为该题目可以使用有记忆搜索的方法,首先我们判断传入的总金额是否小于1,如果小于1则直接返回0,然后我们开始搜索,在搜索的开始部分对剩余总数的值进行判断,如果是0则返回0,如果小于0就直接-1就是无解。开始遍历硬币,将每个硬币,剩余金额传入搜索函数进行递归,如果剩余的金额值在0和最小值之间就进行赋值,否则就不操作,最后用数组去记录最小值即可,直到整体程序结束。那么按照这个思路我们的Java代码如下:

#喷火龙与水箭龟
public class Solution {
    public int coinChange(int[] coins, int amount) {
        if (amount<1) {
            return 0;
        }
        return coinSearch(amount,coins,new int[amount]);
    }

    private int coinSearch(int flag,int[] coins,int[] count) {
        if (flag<0) {
            return -1;
        }
        if (flag==0) {
            return 0;
        }
        if (count[flag-1] !=0) {
            return count[flag-1];
        }
        int smallNum=Integer.MAX_VALUE;
        for (int ij:coins) {
            int tdNum = coinSearch(flag-ij,coins,count);
            if (tdNum>=0 && tdNum<smallNum) {
                smallNum=tdNum+1;
            }
        }
        if(Integer.MAX_VALUE==smallNum){
            count[flag-1]=-1;
        }else{
            count[flag-1]=smallNum;
        }
        return count[flag-1];
    }
}

在这里插入图片描述
    显然,我们还可以使用动态规划的方法进行处理,首先我们根据问题给出动态规划的表达式,也就是F(i)=min(F(i-c))+1,其中c就是当前硬币的面值,每次计算的时候都从上一次进行状态转移,并且要加上硬币数量。所以程序根据这个转移方程式可以写出,首先赋值初始化一个动态规划数组,然后遍历整个硬币数组,并且再遍历从当前硬币到末尾的数组,将动态规划数组的每个值都用转移方程的公式进行计算和赋值,最终返回硬币的数量,如果没有解法则返回-1即可。所以根据这个思路就可以写出代码,下面是Python代码部分:

#喷火龙与水箭龟
class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        dpArr=[float('inf')]*(amount+1)
        dpArr[0]=0
        for ij in coins:
            for jr in range(ij,amount+1):
                dpArr[jr]=min(dpArr[jr],dpArr[jr-ij]+1)
        if(dpArr[amount] != float('inf')):
            return dpArr[amount]
        else:
            return -1

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

おすすめ

転載: blog.csdn.net/qq_26727101/article/details/119836810