70. 爬楼梯
解法:代码随想录
题目:- LeetCode
和377. 组合数II代码随想录算法训练营第四十四天 | 518. 零钱兑换 II、377. 组合总和 Ⅳ_weixin_48345569的博客-CSDN博客思路一致,就是“物品”要自己定义成{1,2}
class Solution {
public int climbStairs(int n) {
int[] res = new int[n + 1];
int[] steps = {1, 2};
res[0] = 1;
for (int i = 0; i <= n; i++) {
for (int s : steps) {
if (i >= s) res[i] += res[i - s];
}
}
return res[n];
}
}
322. 零钱兑换
解法:代码随想录
题目:- LeetCode
这道题思路因为res[j]代表的是钱币的个数,所以每次+1.
初始化一开始没弄对,注意因为是求相对较小个数,要除了res[0]意外的下标初始化成amout + 1, 或者Integer.MAX_VALUE.
因为是求最小个数,所以先遍历背包和物品的顺序可以置换。以下才用了先物品再背包。
note:Arrays.fill(array_name, value)
class Solution {
public int coinChange(int[] coins, int amount) {
int[] res = new int[amount + 1];
Arrays.fill(res, amount + 1);
res[0] = 0;
for (int i : coins) {
for (int j = i; j <= amount; j++) {
res[j] = Math.min(res[j], res[j - i] + 1);
}
}
if (res[amount] == amount + 1) return -1;
return res[amount];
}
}
279.完全平方数
解法:代码随想录
题目:- LeetCode
思路和细节与上题完全一致,就是注意在遍历背包是将物品值平方。
class Solution {
public int numSquares(int n) {
int sq = (int)Math.sqrt(n);
int[] res = new int[n + 1];
Arrays.fill(res, n + 1);
res[0] = 0;
for (int i = 1; i <= sq; i++) {
int tmp = i * i;
for (int j = tmp; j <= n; j++) {
res[j] = Math.min(res[j], res[j - tmp] + 1);
}
}
return res[n];
}
}