目录
讀題
70. 爬楼梯 (进阶)
自己看到题目的第一想法
322. 零钱兑换
自己看到题目的第一想法
看完代码随想录之后的想法
279.完全平方数
自己看到题目的第一想法
70. 爬楼梯 (进阶) - 實作
思路
Code
322. 零钱兑换 - 實作
思路
Code
279.完全平方数 - 實作
思路
Code
總結
自己实现过程中遇到哪些困难
今日收获,记录一下自己的学习时长
相關資料
總結
自己实现过程中遇到哪些困难
今日收获,记录一下自己的学习时长
相關資料
看到這個,我想到是求排列,所以根據排列的核心程式碼,以及初始化值,來解。
看到我想到的是求組合数,並且這個問題要求最小的,感覺像是完全背包問題中求最小值,01背包是求最大那我的做法會不會就是用min去求最小值,但實際去做發現還是沒有太釐清怎麼做
看完之後,才知道原來我的思路,原來很接近,但是因為這次牽涉到的是最小物品数,並且之前都是求最大,所以思路沒有轉過來。
我看到這個題目,我想的是跟零錢兌換很像,但是在這裏面的coins變成是i,物品的重量都是i * i ,所以概念跟零錢兌換基本上都一致,只是物品由題目給出,改為自己計算。
定義DP數組以及下標的含意
dp[j]: 組合為j 的排列方法有dp[j]種
遞推公式
dp[j] += dp[j - i];
根據遞推公式,確定DP數組如何初始化
dp[1] = 1
if(n > 2) dp[2] = 2;
確定遍歷順序
這可以視為一個完全背包的排列應用問題
所以在求背包容量時,是由小到大,而非大到小,因為同樣的數可以重複取
先遍歷背包在遍歷物品,每個物品會在不同的背包中因為順序不同,所以被設定為不同的組合,這是求排序
class Solution {
public:
int climbStairs(int n) {
vector dp(n+1, 0);
dp[1] = 1;
if (n > 1) {
dp[2] = 2;
}
for(int j = 3; j <= n; j++) {
for(int i = 1; i <= 2; i++) {
dp[j] += dp[j - i];
}
}
return dp[n];
}
};
定義DP數組以及下標的含意
dp[j]: 組合金額為j 的最少硬幣有dp[j]個
遞推公式
dp[j] = min(dp[j], dp[j - coins[i]] + 1);
根據遞推公式、題意以及定義,確定DP數組如何初始化
dp[0] = 0 → 根據題意
其他数值設為INT_MAX
確定遍歷順序
這可以視為一個完全背包問題,但是並非要求排列数或組合数,所以排列的先後順序都可以。
所以在求背包容量時,是由小到大,而非大到小,因為同樣的數可以重複取
class Solution {
public:
int coinChange(vector& coins, int amount) {
vector dp (amount + 1, INT_MAX);
dp[0] = 0;
for(int i = 0; i < coins.size(); i++) {
for(int j = coins[i]; j <= amount; j++) {
if (dp[j - coins[i]] != INT_MAX) dp[j] = min(dp[j], dp[j - coins[i]] + 1);
}
}
if(dp[amount] == INT_MAX) return -1;
return dp[amount];
}
};
定義DP數組以及下標的含意
dp[j]: 完全平方数加起來為j 的最少數量的方法有dp[j]種
遞推公式
dp[j] += dp[j - coins[i]];
根據遞推公式,確定DP數組如何初始化
dp[j] = min(dp[j], dp[j - i * i] + 1);
確定遍歷順序
這可以視為一個完全背包問題,但是並非要求排列数或組合数,所以排列的先後順序都可以。
所以在求背包容量時,是由小到大,而非大到小,因為同樣的數可以重複取
主要困難點是在零錢兌換那邊,一開始沒有想得很清楚,但看完講解後,去解完全平方数就很快解出來了
大概學習1.5 hr 左右,主要是了解到了最少值的求法,以及初始化的方式。
● 今日学习的文章链接和视频链接
70. 爬楼梯 (进阶)
https://programmercarl.com/0070.爬楼梯完全背包版本.html
322. 零钱兑换
视频讲解:https://www.bilibili.com/video/BV14K411R7yv
https://programmercarl.com/0322.零钱兑换.html
279.完全平方数
视频讲解:https://www.bilibili.com/video/BV12P411T7Br
https://programmercarl.com/0279.完全平方数.html
class Solution {
public:
int numSquares(int n) {
vector dp (n + 1, INT_MAX);
dp[0] = 0;
dp[1] = 1;
for(int i = 1; i < n;i++) {
double sq = i * i;
for(int j = sq; j <= n; j++) {
if (dp[j - sq] != INT_MAX)dp[j] = min(dp[j], dp[j - sq] + 1);
}
}
return dp[n];
}
};
主要困難點是在零錢兌換那邊,一開始沒有想得很清楚,但看完講解後,去解完全平方数就很快解出來了
大概學習1.5 hr 左右,主要是了解到了最少值的求法,以及初始化的方式。
● 今日学习的文章链接和视频链接
70. 爬楼梯 (进阶)
https://programmercarl.com/0070.爬楼梯完全背包版本.html
322. 零钱兑换
视频讲解:动态规划之完全背包,装满背包最少的物品件数是多少?| LeetCode:322.零钱兑换_哔哩哔哩_bilibili
https://programmercarl.com/0322.零钱兑换.html
279.完全平方数
视频讲解:动态规划之完全背包,换汤不换药!| LeetCode:279.完全平方数_哔哩哔哩_bilibili
https://programmercarl.com/0279.完全平方数.html