代码随想录刷题第45天

文章介绍了使用动态规划解决三类问题:爬楼梯的解决方案展示了如何计算到达指定楼梯阶数的方法数;零钱兑换问题讨论了如何用给定面额的硬币凑出特定金额的最小硬币数量;完全平方数问题则涉及找到表示一个数为若干完全平方数之和的最小数量。
摘要由CSDN通过智能技术生成

代码随想录刷题第45天

爬楼梯


/*

* @lc app=leetcode.cn id=70 lang=cpp

*

* [70] 爬楼梯

*

* https://leetcode.cn/problems/climbing-stairs/description/

*

* algorithms

* Easy (54.06%)

 * Likes:    2882

* Dislikes: 0

 * Total Accepted:    1.1M

* Total Submissions: 2M

 * Testcase Example:  '2'

*

* 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

* 

* 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

* 

* 

* 

* 示例 1:

* 

* 

* 输入:n = 2

* 输出:2

* 解释:有两种方法可以爬到楼顶。

* 1. 1 阶 + 1 阶

* 2. 2 阶

* 

* 示例 2:

* 

* 

* 输入:n = 3

* 输出:3

* 解释:有三种方法可以爬到楼顶。

* 1. 1 阶 + 1 阶 + 1 阶

* 2. 1 阶 + 2 阶

* 3. 2 阶 + 1 阶

* 

* 

* 

* 

* 提示:

* 

* 

* 1 <= n <= 45

* 

* 

*/

 

// @lc code=start

#include <vector>

#include <iostream>

using namespace std;

 

class Solution {

public:

    int climbStairs(int n) {

        int nums[2] = {1,2};

        vector<int> dp(n+1,0);

        dp[0] = 1;

        for (int i = 0; i <= n; i++)

        {

           for (int j = 0; j < 2; j++)

           {

                if (i >= nums[j])

                {

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

                }

 

           }

 

        }

 

    return dp[n];

    }

};

// @lc code=end

 

 

零钱兑换


/*

* @lc app=leetcode.cn id=322 lang=cpp

*

* [322] 零钱兑换

*

* https://leetcode.cn/problems/coin-change/description/

*

* algorithms

* Medium (46.29%)

 * Likes:    2313

* Dislikes: 0

 * Total Accepted:    583.4K

* Total Submissions: 1.3M

 * Testcase Example:  '[1,2,5]\n11'

*

* 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

* 

* 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

* 

* 你可以认为每种硬币的数量是无限的。

* 

* 

* 

* 示例 1:

* 

* 

* 输入:coins = [1, 2, 5], amount = 11

* 输出:3 

* 解释:11 = 5 + 5 + 1

* 

* 示例 2:

* 

* 

* 输入:coins = [2], amount = 3

* 输出:-1

* 

* 示例 3:

* 

* 

* 输入:coins = [1], amount = 0

* 输出:0

* 

* 

* 

* 

* 提示:

* 

* 

* 1 <= coins.length <= 12

* 1 <= coins[i] <= 2^31 - 1

* 0 <= amount <= 10^4

* 

* 

*/

 

// @lc code=start

#include <vector>

#include <iostream>

using namespace std;

 

class Solution {

public:

    int coinChange(vector<int>& coins, int amount) {

        if (amount == 0)

        {

            return 0;

        }

 

        vector<int> dp(amount+1,INT32_MAX);

        dp[0] = 0;

        //金额为 j 的背包最少的硬币数字

        for (int i = 0; i < coins.size(); i++)

        {

            for (int j = coins[i]; j <= amount; j++)

            {

               if (dp[j-coins[i]] != INT32_MAX )

               {

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

               }

 

            }

 

        }

        if (dp[amount] == INT32_MAX)

        {

            return -1;

        }

        return dp[amount];

    }

};

// @lc code=end

 

 

完全平方数


class Solution {

public:

    int numSquares(int n) {

        vector<int> dp(n + 1, INT_MAX);          

        dp[0] = 0;

        for (int i = 1; i * i <= n; i++) { // 遍历物品

            for (int j = i * i; j <= n; j++) { // 遍历背包

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

            }

        }

        return dp[n];

    }

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值