7月26日:零钱兑换
题目如下:
题目要求凑成总金额所需的最少的银币个数。当看到硬币个数最少时,我的大脑立马出现了条件反射。这不是要用动态规划来解题嘛(机智如我)。可是想了一会儿还是想不到状态转移方程。
只好默默的打开题解,感觉题解的思路总是那么晦涩难懂,看着看着我就没了耐心,于是我开始看代码,通过看代码我感觉比看题解思路要容易理解,毕竟题解思路是别人的想法,想将别人的想法理解为自己的东西还是不太容易的,但是代码却是实实在在的东西。然后看代码看懂了就立马开始自己写一遍。一开始写完感觉差不多了,可是运行完成后答案总是0,搞不懂为什么,然后又重新和题解的代码进行对比,发现完全一样,只是变量名不一样。正当我很郁闷的时候突然手一抖,leetcode窗口就自己关闭了,再当我打开时候刚刚写的代码没有了,所以只好重新写一遍了,第二遍写完时提交通过了,真是一件很神奇的事儿。
下面是我的代码:
class Solution {
public int coinChange(int[] coins, int amount) {
if(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 j=0;j<coins.length;j++){
if(i-coins[j]>=0&&dp[i-coins[j]]<min)
min = dp[i-coins[j]]+1;
}
dp[i] = min;
}
return dp[amount]==Integer.MAX_VALUE?-1:dp[amount];
}
}