zoukankan      html  css  js  c++  java
  • LeetCode 322

    https://leetcode-cn.com/problems/coin-change/

    这个题很明显的dp问题,因为当前规模的解基于子问题的解。

    我一开始想的贪婪算法,发现不对,因为每次都兑换最大币值的硬币的情况下可能会出现不能将钱全部换完的情况。

    后来我自己想dp算法,就是从1块钱开始分配,每次都减去coins这个数组中的币值,如果i-coins[j]大于等于0,就是说能兑换这个钱,然后将当前兑换个数和dp[i-coins[j]]+1的值对比,取较小的值。

    但是自己第一次写的时候可能出了点差错,导致这个想法做到最后出了问题。。因为我自己是将dp数组中下标是1~amount的值初始化为Integer.MAX_VALUE,导致一加就爆了int的取值变成Integer.MIN_VALUE了,然后我最后返回值的判断是通过dp[amount]==Integer.MAX_VALUE这个来看是否有解。如果爆了int的取值范围导致这个判断会失效。。。

    最后优化的代码

    class Solution {
        public int coinChange(int[] coins, int amount) {
            int[] dp = new int[amount+1];
            for(int i = 1; i < amount+1; i++){
                dp[i] = amount+1;
            }
            dp[0]=0;
            for(int i = 1; i < amount+1; i++){
                for(int j = 0; j < coins.length; j++){
                    if(i-coins[j] >= 0){
                        dp[i] = Math.min(dp[i],dp[i-coins[j]]+1);
                    }
                }
            }
            return dp[amount]>amount?-1:dp[amount];
        }
    }
  • 相关阅读:
    dyanmics crm workflow 工作流发送邮件配置
    dynamics crm 如何查看组织
    dynamics crm 表单视图JS操作
    dynamics crm 共享取消共享操作
    OpenTK入门系列一 创建窗体
    linux组管理和权限管理
    linux常用指令
    linux开关机
    linux运行级别
    linux开启sshd服务
  • 原文地址:https://www.cnblogs.com/ZJPaang/p/12803798.html
Copyright © 2011-2022 走看看