代碼隨想錄算法訓練營|第四十八天|70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数。刷题心得(c++)

目录

讀題

70. 爬楼梯 (进阶)

自己看到题目的第一想法

322. 零钱兑换

自己看到题目的第一想法

看完代码随想录之后的想法

279.完全平方数

自己看到题目的第一想法

70. 爬楼梯 (进阶) - 實作

思路

Code

322. 零钱兑换 - 實作

思路

Code

279.完全平方数 - 實作

思路

Code

總結

自己实现过程中遇到哪些困难

今日收获,记录一下自己的学习时长

相關資料

總結

自己实现过程中遇到哪些困难

今日收获,记录一下自己的学习时长

相關資料


讀題

70. 爬楼梯 (进阶)

自己看到题目的第一想法

看到這個,我想到是求排列,所以根據排列的核心程式碼,以及初始化值,來解。

322. 零钱兑换

自己看到题目的第一想法

看到我想到的是求組合数,並且這個問題要求最小的,感覺像是完全背包問題中求最小值,01背包是求最大那我的做法會不會就是用min去求最小值,但實際去做發現還是沒有太釐清怎麼做

看完代码随想录之后的想法

看完之後,才知道原來我的思路,原來很接近,但是因為這次牽涉到的是最小物品数,並且之前都是求最大,所以思路沒有轉過來。

279.完全平方数

自己看到题目的第一想法

我看到這個題目,我想的是跟零錢兌換很像,但是在這裏面的coins變成是i,物品的重量都是i * i ,所以概念跟零錢兌換基本上都一致,只是物品由題目給出,改為自己計算。

70. 爬楼梯 (进阶) - 實作

思路

  1. 定義DP數組以及下標的含意

    dp[j]: 組合為j 的排列方法有dp[j]種

  2. 遞推公式

    dp[j] += dp[j - i];

  3. 根據遞推公式,確定DP數組如何初始化

    dp[1] = 1

    if(n > 2) dp[2] = 2;

  4. 確定遍歷順序

    這可以視為一個完全背包的排列應用問題

    所以在求背包容量時,是由小到大,而非大到小,因為同樣的數可以重複取

    先遍歷背包在遍歷物品,每個物品會在不同的背包中因為順序不同,所以被設定為不同的組合,這是求排序

Code

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];
    }
};

322. 零钱兑换 - 實作

思路

  1. 定義DP數組以及下標的含意

    dp[j]: 組合金額為j 的最少硬幣有dp[j]個

  2. 遞推公式

    dp[j] = min(dp[j], dp[j - coins[i]] + 1);

  3. 根據遞推公式、題意以及定義,確定DP數組如何初始化

    dp[0] = 0 → 根據題意

    其他数值設為INT_MAX

  4. 確定遍歷順序

    這可以視為一個完全背包問題,但是並非要求排列数或組合数,所以排列的先後順序都可以。

    所以在求背包容量時,是由小到大,而非大到小,因為同樣的數可以重複取

Code

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];
    }
};

 

279.完全平方数 - 實作

思路

  1. 定義DP數組以及下標的含意

    dp[j]: 完全平方数加起來為j 的最少數量的方法有dp[j]種

  2. 遞推公式

    dp[j] += dp[j - coins[i]];

  3. 根據遞推公式,確定DP數組如何初始化

    dp[j] = min(dp[j], dp[j - i * i] + 1);

  4. 確定遍歷順序

    這可以視為一個完全背包問題,但是並非要求排列数或組合数,所以排列的先後順序都可以。

    所以在求背包容量時,是由小到大,而非大到小,因為同樣的數可以重複取

Code

總結

自己实现过程中遇到哪些困难

主要困難點是在零錢兌換那邊,一開始沒有想得很清楚,但看完講解後,去解完全平方数就很快解出來了

今日收获,记录一下自己的学习时长

大概學習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

 

你可能感兴趣的:(算法,c++,开发语言,动态规划,数据结构)