• 代码随想录 Day-44|#70 爬楼梯(进阶)|#322 零钱兑换|#279 完全平方数


    清单

    ● 70. 爬楼梯 (进阶)
    ● 322. 零钱兑换
    ● 279.完全平方数

    LeetCode #70 爬梯子(进阶)

    1. 题目

    假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
    每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

    2. 思路

    类似于昨天做的题目,但遍历顺序为先遍历背包(n阶台阶)再遍历物品 (1/2台阶)

    3. 代码实现

    class Solution:
        def climbStairs(self, n: int) -> int:
            dp = [0] * (n+1)
            dp[0] = 1
            m = 2
            for i in range(n+1):
                for j in range(1, m+1):
                    if i >= j:
                        dp[i] += dp[i-j]
            return dp[n]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    LeetCode #322 零钱兑换

    1. 题目

    给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
    计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
    你可以认为每种硬币的数量是无限的

    2. 思路

    五部曲

    1. dp数组含义: 达到金额i所需要的最少硬币个数dp[i]
    2. 递推公式: dp[i] = min(dp [i-coins[j]] + 1, dp[i])
    3. 初始化: 递推公式中每次取最小值,为了避免全为0,dp[i] = float(‘inf’)
    4. 遍历顺序: 所求值为总金额所需最少硬币个数,正序/倒序均可

    3. 代码实现

    class Solution:
        def coinChange(self, coins: List[int], amount: int) -> int:
            dp = [float('inf')] * (amount + 1)
            dp[0] = 0
    
            for coin in coins:
                for i in range(coin,amount + 1):
                    if dp[i-coin] != float('inf'):
                        dp[i] = min(dp[i - coin] + 1,dp[i])
            
            if dp[amount] == float('inf'):
                return -1
            return dp[amount]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    LeetCode #279 完全平方数

    1. 题目

    给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
    给你一个整数 n ,返回和为 n 的完全平方数的最少数量。
    完全平方数是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。

    2. 思路

    1. dp数组含义: 和为n的完全平方数的最少数量
    2. 递推公式: dp[n] = min(dp[n - i*i], dp[n])
    3. 初始化: 取最小值,且dp[0] = 0, 因此dp[n] = float(‘inf’),避免全被初始值覆盖
    4. 遍历顺序: 求最少数量,正序/倒序均可

    3. 代码实现

    class Solution:
        def numSquares(self, n: int) -> int:
            dp = [float('inf')] * (n + 1)
            dp[0] = 0
    
            for i in range(1, n+1):
                for j in range(1, int(i ** 0.5) + 1):
                    dp[i] = min(dp[i - j*j] + 1,dp[i])
            
            return dp[n]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    Velocity 不用愁!Velocity 系统的前端工程化之路
    C++特殊类与单例模式
    OpenResty安装
    git使用,一点点
    通过IP地址进行精准定位技术、方法与隐私问题的探讨
    查看网卡速率脚本
    SSM SpringBoot vue学校办公自动化系统
    C++转换函数
    函数的参数
    详解--Hash(中文也称散列、哈希)
  • 原文地址:https://blog.csdn.net/weixin_54191598/article/details/133231970