java 动态规划找零钱_初探动态规划——LeetCode找零钱问题

1.简介:

在leetcode上刷题的时候,遇到了一道找零钱的动态规划题,后台测试用例很变态,必须把算法优化的很好才能通过。也借此机会好好的研究了一下动态规划。在下小白一个,大神轻喷。

2.题目如下:

50ccd1c01ff1

image.png

分析:我们可以从最简单的暴力搜索开始,先优化成记忆搜索方法,再到动态规划,最后再对动态规划进行空间优化。

1)最简单的思路就是用暴力搜索的方法,枚举每一种情况,累加求和,但存在大量重复计算。时间复杂度 > O((amount * coins.length)²)

2)进一步我们可以优化成记忆搜索方法,将每一个计算结果保存下来,用空间换时间,减少重复计算。时间复杂度 = O((amount * coins.length)²)

3)在记忆搜索的基础上,优化成动态规划,规划好路径,消除重复计算。和记忆搜索一样,用空间换时间。

时间复杂度O(amount * coins.length)

2.暴力搜索法

暴力搜索即用穷举法解决,穷举每一种可能再累加,基于示例1来看

1)结果 = 当不用coins[0]硬币时的组合数 +

使用1个coins[0]硬币时的组合数 +

使用2个coins[0]硬币时的组合数 +

...

使用5个coins[0]硬币时的组合数。

2)不使用coins[0]硬币 = 不使用coins[1]硬币 +

使用1个coins[1]硬币 +

使用2个coins[1]硬币+

...

对每个子项累加等于amount时返回1,否则0

可以用amount累减来代替累加

代码如下:

public void solveCutCoin(int[] coins, int amount){

System.out.println(codeCutCoin(coins, 0, amount));

}

//返回coinArr[index...N-1]种硬币的分割方法

public int codeCutCoin(int[] coins, int index,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值