代码随想录算法训练营第四十五天 | 零钱兑换、完全平方数
● 今日学习的文章链接和视频链接
题目322. 零钱兑换
题目279. 完全平方数
● 看到题目的第一想法
还是背包
● 看完代码随想录之后的想法
背包问题解法都很相似,主要是处理背包和物品的关系
● 实现过程中遇到哪些困难
no time
● 解题代码
-
点击查看代码
class Solution { public int coinChange(int[] coins, int amount) { int max = Integer.MAX_VALUE; int[] dp = new int[amount + 1]; //初始化dp数组为最大值 for (int j = 0; j < dp.length; j++) { dp[j] = max; } //当金额为0时需要的硬币数目为0 dp[0] = 0; for (int i = 0; i < coins.length; i++) { //正序遍历:完全背包每个硬币可以选择多次 for (int j = coins[i]; j <= amount; j++) { //只有dp[j-coins[i]]不是初始最大值时,该位才有选择的必要 if (dp[j - coins[i]] != max) { //选择硬币数目最小的情况 dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1); } } } return dp[amount] == max ? -1 : dp[amount]; } } -
点击查看代码
class Solution { // 版本二, 先遍历背包, 再遍历物品 public int numSquares(int n) { int max = Integer.MAX_VALUE; int[] dp = new int[n + 1]; // 初始化 for (int j = 0; j <= n; j++) { dp[j] = max; } // 当和为0时,组合的个数为0 dp[0] = 0; // 遍历背包 for (int j = 1; j <= n; j++) { // 遍历物品 for (int i = 1; i * i <= j; i++) { dp[j] = Math.min(dp[j], dp[j - i * i] + 1); } } return dp[n]; } }
● 今日收获,学习时长
今日收获:背包问题
学习时长:1h
浙公网安备 33010602011771号