试图了解时间复杂性 - Leetcode上的DP硬币变化

时间:2016-08-12 20:55:09

标签: java performance time-complexity dynamic-programming

我试图了解时间复杂度/如何编写更有效的算法。

有人可以解释为什么硬币更换问题解决方案的第一个例子比第二个更快?代码在第一个代码更清晰,但是什么使它更快?它实际上更快,因为代码行数较少? (请原谅我,如果这很明显 - 我只是学习时间的复杂性,我的理解基本上只是:嵌套for循环是指数的,常规循环是线性的,基本逻辑是恒定的时间......)

如果您不熟悉,

Here's a link会遇到问题

更好的解决方案 - 在18毫秒内运行

public int coinChange(int[] coins, int amount) {
    if (amount < 1) return 0;
    int[] dp = new int[amount + 1]; 
    Arrays.fill(dp, Integer.MAX_VALUE);
    dp[0] = 0;
    for (int coin : coins) {
        for (int i = coin; i <= amount; i++) {
            if (dp[i - coin] != Integer.MAX_VALUE) {
                dp[i] = Math.min(dp[i], dp[i - coin] + 1);
            }
        }
    }
    return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];
}

更糟糕的解决方案 - 在26毫秒内运行

public int coinChange(int[] coins, int amount) {
       int[] dp = new int[amount+1];
       Arrays.fill(dp, Integer.MAX_VALUE-1);
       dp[0] = 0;

       if(amount == 0){
           return 0;
       }

       for(int j=0; j<coins.length; j++){
           for(int i=1; i<=amount; i++){
               //only continue if coin is less than sum at i
               if(i >= coins[j]){
                   //if there is a smaller sum +1 less than current sum
                   if(dp[i - coins[j]] +1 < dp[i]){
                       dp[i] = 1 + dp[i-coins[j]];
                   }
               }
           }
       }

       if(dp[amount] == Integer.MAX_VALUE-1){
           return -1;
       } else{
           return dp[amount];
       }
    }

0 个答案:

没有答案