当前位置: 首页剑指offer刷题第三期问题详情 【动态规划专题】LeetCode 322. 零钱兑换 本问题对应课程链接:剑指offer刷题第三期 要求: 1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。 2、给出你代码所用的时间复杂度和空间复杂度
共以下 10 个回答
public class Solution {
public int coinChange(int[] coins, int amount) {
int max = amount + 1;
int[] dp = new int[amount + 1];
Arrays.fill(dp, max);
dp[0] = 0;
for (int i = 1; i <= amount; i++) {
for (int j = 0; j < coins.length; j++) {
if (coins[j] <= i) {
dp[i] = Math.min(dp[i], dp[i – coins[j]] + 1);
}
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
}
动态规划
时间复杂度:O(sn) s是总金额,n是面额数
空间复杂度:O(s)
MY动态规划
时间:O(mn)
空间:O(n)
C++实现
“`C++& coins, int amount) { dp(amount+1, INT_MAX);
class Solution {
public:
int coinChange(vector
vector
dp[0] = 0;
for(int j=1;j<=amount;j++) { for(auto coin: coins) { if(j-coin>=0&&dp[j-coin]!=INT_MAX)
dp[j]=min(dp[j], dp[j-coin]+1);
}
}
if(dp[amount]==INT_MAX)
return -1;
return dp[amount];
}
};
“`
时间复杂度:O(n * amount)
动态规划
时间复杂度O(n)