代码随想录算法训练营Day45 | 动态规划(7/17) LeetCode 70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数

2023-09-15 23:13:22

开始第七天的练习!

第一题

70. Climbing Stairs

You are climbing a staircase. It takes n steps to reach the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

在刚进行动态规划的练习时候,曾经用简单的方法做过这道题。但是现在学了背包问题的思想,可以在原题上进行改动:一步一个台阶,两个台阶,三个台阶,…,直到 m个台阶。问有多少种不同的方法可以爬到楼顶呢?


1阶,2阶,… m阶就是物品,楼顶就是背包。
每一阶可以重复使用,例如跳了1阶,还可以继续跳1阶。
问跳到楼顶有几种方法其实就是问装满背包有几种方法。

  1. 确定dp数组以及下标的含义
    1. dp[i]:爬到有i个台阶的楼顶,有dp[i]种方法。
  2. 确定递推公式
    1. 本题dp[i]有几种来源,dp[i - 1],dp[i - 2],dp[i - 3] 等等,即:dp[i - j]
    2. 那么递推公式为:dp[i] += dp[i - j]
  3. dp数组如何初始化、
    1. 既然递归公式是 dp[i] += dp[i - j],那么dp[0] 一定为1,dp[0]是递归中一切数值的基础所在,如果dp[0]是0的话,其他数值都是0了。
    2. 下标非0的dp[i]初始化为0,因为dp[i]是靠dp[i-j]累计上来的,dp[i]本身为0这样才不会影响结果。
  4. 确定遍历顺序
    1. 这是背包里求排列问题,即:1、2 步 和 2、1 步都是上三个台阶,但是这两种方法不一样!
    2. 所以需将target放在外循环,将nums放在内循环。
    3. 每一步可以走多次,这是完全背包,内循环需要从前向后遍历。
  5. 举例来推导dp数组
class Solution:
    def climbStairs(self, n: int) -> int:
        dp = [0]*(n+1)
        dp[0] = 1

        for i in range(n+1):
            for j in range(1,m+1):
                if i - j >= 0:
                    dp[i] += dp[i-j]

        return dp[-1]

第二题

322. Coin Change

You are given an integer array coins representing coins of different denominations and an integer amount representing a total amount of money.

Return the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.

You may assume that you have an infinite number of each kind of coin.

由于硬币总数量无限,因此这是完全背包问题。

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]  

第三题

279. Perfect Squares

Given an integer n, return the least number of perfect square numbers that sum to n.

perfect square is an integer that is the square of an integer; in other words, it is the product of some integer with itself. For example, 149, and 16 are perfect squares while 3 and 11 are not.

仍然是完全背包问题

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], dp[i - j * j] + 1)

        return dp[n]

更多推荐

计算机网络与技术——物理层

😊计算机网络与技术——物理层👻物理层的基本概念👻数据通信基础知识🚢数据通信系统的模型🚢信道的基本概念🚢信道的极限容量👻物理层下面的传输媒体🔊导引型传输媒体🔊非导引型传输媒体👻信道复用技术🥏频分复用、时分复用和统计时分复用🥏波分复用🥏码分复用👻宽带接入技术☃️ADSL技术☃️光纤同轴混合网(H

强强联合,波卡生态正成为物联网赛道关键入口

自5月23日,波卡平行链之一Peaq宣布将特斯拉和去中心化汽车共享应用引入Polkadot生态系统后,其以打造Polkadot上Web3汽车共享的未来为目标,开启物联网发展的新时代;而在近期,Peaq又表示将在9月前往德国慕尼黑IAAMOBILITY2023,作为L1底层架构参与特斯拉和捷豹汽车的现场演示。在这场展示活

什么是边缘计算网关?

边缘计算网关(简称边缘网关)将云端功能扩展到本地的边缘设备,使边缘设备能够快速自主地响应本地事件,提供低延时、低成本、隐私安全、本地自治的本地计算服务。同时所有服务都以Docker镜像方式安装,真正做到了跨平台,部署快捷,易管理。在链路安全,应用场景,云开发组件等也都做到了非常好的支持。涂鸦提供了丰富的物联网协议,客户

985、211高校分布

985、211高校分布985211985全国985大学有39所1、北京市(8所)北京大学、中国人民大学、清华大学、北京航空航天大学、北京理工大学、中国农业大学、北京师范大学、中央民族大学2、天津市(2所)南开大学、天津大学3、辽宁省(2所)大连理工大学、东北大学4、吉林省(1所)吉林大学5、黑龙江省(1所)哈尔滨工业大

批量调整视频饱和度和色度,提升你的视频剪辑效率!

作为一名视频剪辑师,你是否经常为如何高效地调整多个视频的饱和度和色度而烦恼?现在,我们为你提供了一种简单、快速、准确的方法,帮助你轻松解决这个问题!首先我们要进入好简单批量智剪,并在左侧的板块栏里选择“任务剪辑”第二步,进入板块之后,并点击“添加视频”在弹出来的文件框里,将要调整的视频都一一导入。第三步,导入后,所有视

电脑入门:怎么进入路由器设置

怎么进入路由器设置在浏览器地址栏上输入路由器的出厂默认IP地址(192.168.0.1)后按回车。在登录窗口中输入说明书上的密码,点击“Login”按钮进入宽带路由器管理设置界面。管理设置界面分为左右栏,左栏是主菜单,右边则是与之对应的设置内容。请根据自己接入的宽带类型来做出正确的选择。第一项“DynamicIPAdd

MySQL 几种导数据的方法与遇到的问题

零、说在前面MySQL导数据通常使用第三方工具和MySQL自身的工具,本文分别就这两类方法分别介绍。一、第三方工具之Navicat1.1、Navicat的“数据传输”工具打开Navicat,点击“工具”标签,找到“数据传输”,即可看到操作界面。这里不对这个工具本身做过多介绍,侧重点在于工具中的一些配置选项的含义的介绍上

LeetCode每日练习之链表常见题目

1.两个链表的第一个公共节点输入两个链表,找出它们的第一个公共节点。1.1思路哈希和集合,先将一个链表全部存到Map里,然后一边遍历第二个链表,一边检测Hash是否存在当前结点,如果有交点,那么一定能检测出来,使用两个栈,分别将两个链表入栈,然后分别出栈对比,如果相等就出栈,知道找到最晚出栈的那组,拼接两个字符串,将两

【论文记录】Boosting Detection in Crowd Analysis via Underutilized Output Features

BoostingDetectioninCrowdAnalysisviaUnderutilizedOutputFeaturesAbstractCrowdHat使用一种混合的2D-1D压缩技术进行细化空间特征与获取特定人群信息的空间和数量分布。进一步的,CrowdHat采用自适应区域的NMS阈值与一个解耦然后对齐的范式来解

猫眼 面经和答案

你好,我是田哥上一篇文章,给大家分享了几家公司的面经;最新猫眼、阿里云、美团....面经有朋友私聊我,说昨天的这篇文章中,只给出了面试题,没有答案,今天给安排一份猫眼面经的参考答案。在线刷题小程序面试题自我介绍项目用到的技术栈、项目问的比较多,一定要多看三次握手四次挥手缓存穿透和雪崩的原因和解决方法布隆过滤器你了解吗m

c++最短路计数(acwing版)

先看题目:给出一个N个顶点M条边的无向无权图,顶点编号为1到N。问从顶点1开始,到其他每个点的最短路有几条。输入格式第一行包含2个正整数N,M,为图的顶点数与边数。接下来M行,每行两个正整数x,y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边。输出格式输出N行,每行一个非负整数,第i行输出从顶点1到顶点i有多

热文推荐