本文共 1118 字,大约阅读时间需要 3 分钟。
重新优化后的内容如下:
硬币改变问题常用动态规划法解决,目标是找到组成给定金额所需的最少硬币数量。以下代码示例展示了该算法的实现思路。
public int coinChange(int[] coins, int amount) { if (amount == 0) return 0; if (coins == null || coins.length == 0) return -1; int[] dp = new int[amount + 1]; for (int i = 1; i <= amount; i++) { int min = Integer.MAX_VALUE; for (int face : coins) { if (face > i) continue; int value = dp[i - face]; if (value < 0 || value > min) continue; min = value; } if (min == Integer.MAX_VALUE) dp[i] = -1; else dp[i] = min + 1; } return dp[amount];} 初始化状态数组:创建一个名为dp的数组,其长度为目标金额加1。dp[i]表示组成金额i所需的最少硬币数。初始化时,dp[0]通常为0,因为不需要硬币可以组成0元。
定义递推关系:对于每一个金额i(从1到amount),初始化一个min值为最大可能值(Integer.MAX_VALUE)。然后遍历每一个硬币的面值face:
face大于当前金额i,跳过。face,获取组成金额i-face所需的硬币数量。若dp[i-face]值为负数或大于当前min值,则忽略这种情况。min为找到最小的硬币数量。min仍为最大可能值,说明无法组成金额i,设为-1。如果自然得到的最少硬币数是可行的,则设为min + 1。返回结果:最终,dp[amount]中存储的值即为组成给定金额所需的最少硬币数量。若无法组成,该值为-1。
此算法通过一次遍历所有可能金额,并对每个金额尝试每个硬币面值,时间复杂度为O(n*m),其中n为金额,m为硬币面值数量。
转载地址:http://moznz.baihongyu.com/