算法打卡day39

news2024/11/15 21:28:22

今日任务:

1)卡码网57. 爬楼梯(70. 爬楼梯进阶版)

2)322.零钱兑换

3)279.完全平方数

4)复习day14

卡码网57. 爬楼梯(70. 爬楼梯进阶版)

题目链接:57. 爬楼梯(第八期模拟笔试) (kamacoder.com)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬至多m (1 <= m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。

输入描述:输入共一行,包含两个正整数,分别表示n, m
输出描述:输出一个整数,表示爬到楼顶的方法数。

输入示例:3 2
输出示例:3

提示:
当 m = 2,n = 3 时,n = 3 这表示一共有三个台阶,m = 2 代表你每次可以爬一个台阶或者两个台阶。
此时你有三种方法可以爬到楼顶。
1 阶 + 1 阶 + 1 阶段
1 阶 + 2 阶
2 阶 + 1 阶

文章讲解:代码随想录 (programmercarl.com)

思路:

这是之前70爬楼梯的变体,之前70是只能至多爬两个台阶

这次改为:一步一个台阶,两个台阶,三个台阶,.......,直到 m个台阶。问有多少种不同的方法可以爬到楼顶呢?

这其实是一个求排列组合的完全背包问题。

1阶,2阶,.... m阶就是物品,楼顶就是背包。

每一阶可以重复使用,例如跳了1阶,还可以继续跳1阶。

问跳到楼顶有几种方法其实就是问装满背包有几种方法。

  • 我们定义一个一维数组 dp,其中 dp[i] 表示爬到第 i 阶楼梯的方法数。初始状态 dp[0] = 1,因为爬到第 0 阶楼梯有一种方法,即不爬。
  • 然后我们从第 1 阶开始遍历到第 n 阶,对于每一阶楼梯,我们考虑可以从前面的 m 个楼梯中的任意一个跳过来,因此 dp[i] = dp[i-1] + dp[i-2] + ... + dp[i-m]
def climbing_stairs(n,m):
    # 背包总容量
    dp = [0]*(n+1)
    dp[0] = 1

    # 排列题,注意循环顺序,背包在外物品在内5
    for j in range(n+1):
        for i in range(1,m+1):
            if j >= i:
                dp[j] += dp[j - i] # 这里i就是物品重量而非index

    return dp[-1]

if __name__ == '__main__':
    n,m = list(map(int,input().split(' ')))
    print(climbing_stairs(n,m))

322.零钱兑换

题目链接:322. 零钱兑换 - 力扣(LeetCode)

给定不同面额的硬币 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

示例 4:
输入:coins = [1], amount = 1
输出:1

示例 5:
输入:coins = [1], amount = 2
输出:2

提示:
1 <= coins.length <= 12
1 <= coins[i] <= 2^31 - 1
0 <= amount <= 10^4

文章讲解:代码随想录 (programmercarl.com)

视频讲解:动态规划之完全背包,装满背包最少的物品件数是多少?| LeetCode:322.零钱兑换哔哩哔哩bilibili

思路:

题目中说每种硬币的数量是无限的,可以看出是典型的完全背包问题。

但是是求最小数硬币数,也就是说不涉及排列,所以这题我们应该先遍历物品,也就是硬币,再遍历背包容量

硬币可以重复,那我们应该从前往后遍历

1.确定dp数组以及下标的含义

dp[j]:凑足总额为j所需钱币的最少个数为dp[j]

2.确定递推公式

凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j](考虑coins[i])

所以dp[j] 要取所有 dp[j - coins[i]] + 1 中最小的。

递推公式:dp[j] = min(dp[j - coins[i]] + 1, dp[j]);

3.dp数组如何初始化

首先凑足总金额为0所需钱币的个数一定是0,那么dp[0] = 0;

其他下标对应的数值呢?

考虑到递推公式的特性,dp[j]必须初始化为一个最大的数,否则就会在min(dp[j - coins[i]] + 1, dp[j])比较的过程中被初始值覆盖。

所以下标非0的元素都是应该是最大值。

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        # 初始化动态规划数组,初始值为正无穷,表示无法凑成任何金额
        dp = [float('inf')]*(amount+1)
        # 设置总金额为0时需要的硬币个数为0
        dp[0] = 0

        # 遍历硬币面额
        for coin in coins:
            # 从当前硬币面额开始,遍历到总金额,更新动态规划数组
            for j in range(coin,amount+1):
                # 动态规划转移方程,更新当前总金额所需的最少硬币个数
                dp[j] = min(dp[j],dp[j-coin]+1)

        # 如果最终总金额对应的动态规划数组值仍然是正无穷,则表示无法凑成总金额,返回-1
        # 否则返回最终总金额对应的动态规划数组值
        return -1 if dp[-1] == float('inf') else dp[-1]

if __name__ == '__main__':
    obj = Solution()
    # coins,amount = [1, 2, 5],11
    # coins,amount = [2],3
    coins,amount = [1],0
    print(obj.coinChange(coins, amount))

279.完全平方数

题目链接:279. 完全平方数 - 力扣(LeetCode)

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

示例 1:
输入:n = 12
输出:3
解释:12 = 4 + 4 + 4

示例 2:
输入:n = 13
输出:2
解释:13 = 4 + 9

提示:
1 <= n <= 10^4

文章讲解:代码随想录 (programmercarl.com)

视频讲解:动态规划之完全背包,换汤不换药!| LeetCode:279.完全平方数哔哩哔哩bilibili

思路:

  1. 创建一个动态规划数组dp,其中dp[j]表示和为j的完全平方数的最少数量。
  2. 初始化dp数组,将dp[0]设置为0,其他元素设置为正无穷。
  3. 遍历从1到n的所有数num,对于每个数num,遍历从num*num到n的所有可能的和j。
  4. 对于每个可能的和j,更新dp[j],将其设置为dp[j]和dp[j-num*num]+1的较小值,表示如果选择当前的完全平方数num,所需的硬币数量。
  5. 最终返回dp[n]作为结果,表示和为n的完全平方数的最少数量。
class Solution:
    def numSquares(self, n: int) -> int:
        # 创建动态规划数组,dp[j]表示和为j的完全平方数的最少数量
        dp = [float('inf')]*(n+1)
        dp[0] = 0# 初始化和为0时的数量为0
        # 计算不超过n的最大完全平方数
        max_num = int(n ** 0.5) + 1

        # 遍历从1到n的所有可能的完全平方数
        for num in range(1,max_num + 1):
            # 遍历从num*num到n的所有可能的和
            for j in range(num*num,n+1):
                if j >= num*num:
                    # 更新dp[j],选择较小的值表示当前和的最少数量
                    dp[j] = min(dp[j],1+dp[j-num*num])

        return dp[-1]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1615733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

太奇怪了!99%的人没见过的Oracle故障:网络恢复后,集群的监听和vip无法启动

故障描述 15:46操作系统日志出现net4、net5网卡down&#xff0c;15:53分钟的网络恢复。网络中断是由于db汇聚交换机出现了问题。 网络恢复后&#xff0c;节点1的监听和vip无法启动。 故障分析 查看grid alert日志可以看到监听资源确实没有正常启动。 由于监听资源是crs的Ora…

Redis服务

参考文章&#xff1a; Win.dow.s上安装Redis教程 redis数据库基础篇 Redis 的安装及图形化界面 Redis DeskTop Manager 的安装与使用 下载Redis Redis压缩包 打开Redis 法1&#xff1a; 双击redis-server.exe 应用程序 法2&#xff1a; 进入redis目录下&#xff0c;打cmd…

Python安装和开发环境搭建

Python的下载 访问Python语言官网(Welcome to Python.org)进行下载相关安装包&#xff0c;根据需要和系统环境、下载相应的windows/linux/macOs安装包。 ​ 更新的还是挺快的&#xff0c;都到3.12.3了。 直接点Download哪里的Python 3.12.3。 ​ 我这边系统是64位&#xf…

Rumble Club上线时间+配置要求+游戏价格+加速器推荐

Rumble Club上线时间配置要求游戏价格加速器推荐 Rumble Club是一款基于物理的玩家大乱斗游戏&#xff0c;该作拥有丰富饱满的视觉效果和趣味性十足的游玩极致&#xff0c;让玩家可以各种富有想象力的方式&#xff0c;推搡、戏耍好友。该作即将正式上线&#xff0c;为了避免玩…

MyBatis 框架学习(I)

MyBatis 框架学习(I) 文章目录 MyBatis 框架学习(I)1. 介绍2. 准备&测试3. MyBatis 注解基础操作3.1 日志输出3.2 Insert 操作3.3 Delete 操作3.4 Update 操作3.5 Select 操作 总结 1. 介绍 之前我们学习过利用JDBC操作数据库进行项目开发&#xff0c;但我们发现它操作起来…

Mybatis多表查询和注解开发

文章目录 Mybatis多表查询套路一对一查询一对多查询 注解开发概述相关注解步骤新增主键回填 查询别名映射模糊查询 动态SQL(了解) Mybatis多表查询 套路 基于需求编写SQL语句基于SQL语句的查询结果&#xff0c;分析类与类之间关联(建立实体类和实体类的关联)在映射文件中&…

2024年51cto视频如何提取

2024年51cto视频如何提取出来&#xff0c;本文就教大家如何下载51cto网页上的视频 首先要准备以下工具 小白51cto链接&#xff1a;https://pan.baidu.com/s/1kbsK2w4rjK8VQcSSg_B0aw?pwd1234 提取码&#xff1a;1234 --来自百度网盘超级会员V10的分享 1.首先下载我给大家…

【Linux】破解工具John the Ripper和端口扫描工具NMAP

一、弱口令检测---John the Ripper 1.了解 John the Ripper John the Ripper 是一款开源的密码破解工具&#xff0c;可使用密码字典&#xff08;包含各种密码组合的列表文件&#xff09;来进行暴力破解。 一款密码分析工具&#xff0c;支持字典式的暴力破解通过对shadow文件…

数据结构系列-堆排序

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 昨天我们实现的堆的搭建&#xff0c;我们今天实现以下堆的排序&#xff0c; 堆的排序的最大的优点就是提高的效率&#xff0c;减小了时间复杂度&#xff0c;在这个里面我们有一个…

YoloV8改进策略:卷积改进|DOConv轻量卷积,即插即用|适用各种场景

摘要 本文使用DOConv卷积&#xff0c;替换YoloV8的常规卷积&#xff0c;轻量高效&#xff0c;即插即用&#xff01;改进方法非常简单。 DO-Conv&#xff08;Depthwise Over-parameterized Convolutional Layer&#xff09;是一种深度过参数化的卷积层&#xff0c;用于提高卷…

52 文本预处理【动手学深度学习v2】

将文本作为字符串加载到内存中。 将字符串拆分为词元&#xff08;如单词和字符&#xff09;。 建立一个词表&#xff0c;将拆分的词元映射到数字索引;将文本转换为数字索引序列&#xff0c;方便模型操作。

清华新突破,360°REA重塑多智能体系统:全方位提升复杂任务表现

引言&#xff1a;多智能体系统的新篇章——360REA框架 在多智能体系统的研究领域&#xff0c;最新的进展揭示了一种全新的框架——360REA&#xff08;Reusable Experience Accumulation with 360 Assessment&#xff09;。这一框架的提出&#xff0c;不仅是对现有系统的一次重大…

模块三——二分:704.二分查找

文章目录 前言二分查找算法简介特点学习中的侧重点算法原理模板 题目描述算法原理解法一&#xff1a;暴力解法解法二&#xff1a;二分查找算法算法流程细节问题循环结束的条件为什么是正确的&#xff1f;时间复杂度 代码实现 前言 本系列博客是逐渐深入的过程&#xff0c;建议…

函数的内容

一&#xff0c;概念 封装一份可以被重复执行的代码块&#xff0c;让大量代码重复使用 二&#xff0c;函数使用 大体分两步&#xff1a;声明函数&#xff0c;调用函数 声明函数有关键字&#xff1a;function 函数名&#xff08;&#xff09;{ 函数体 } 为基本格式&#xf…

代码随想录算法训练营第四十八天| 198.打家劫舍,213.打家劫舍II,337.打家劫舍III

题目与题解 198.打家劫舍 题目链接&#xff1a;198.打家劫舍 代码随想录题解&#xff1a;​​​​​​​198.打家劫舍 视频讲解&#xff1a;动态规划&#xff0c;偷不偷这个房间呢&#xff1f;| LeetCode&#xff1a;198.打家劫舍_哔哩哔哩_bilibili 解题思路&#xff1a; 这道…

阿里巴巴Java开发规范——编程规约(3)

# 阿里巴巴Java开发规范——编程规约&#xff08;3&#xff09; 编程规约 &#xff08;四&#xff09; OOP规约 1.【强制】构造方法里面禁止加入任何业务逻辑&#xff0c;如果有初始化逻辑&#xff0c;请放在 init 方法中 这条编程规范的目的是为了保持代码的清晰性、可读性…

非计算机专业考软考高项有必要吗?

我认为这非常重要。 看了你的介绍&#xff0c;如果你已经考取了会计证书&#xff0c;而且想要考取计算机专业的证书&#xff0c;或者你的职业规划涉及到计算机岗位&#xff0c;又或者你对计算机感兴趣&#xff0c;我建议你优先考虑软考&#xff0c;因为这个证书的含金量是有保…

问题带来多少成长,看你挖得有多深多痛

原文: 一次Redis访问超时的“捉虫”之旅 力是相互的&#xff0c;成长与痛苦也是相互的。 01-引言 最近在对一个老项目使用的docker镜像版本升级过程中碰到一个奇怪的问题&#xff0c;发现项目升级到高版本镜像后&#xff0c;访问Redis会出现很多超时错误&#xff0c;而降回之…

【数学建模】虫子追击问题(仿真)

已知 有四个虫子,分别是 A , B , C , D A,B,C,D A,B,C,D A , B , C , D A,B,C,D A,B,C,D分别在 ( 0 , 0 ) , ( 0 , 1 ) , ( 1 , 1 ) , ( 1 , 0 ) (0,0),(0,1),(1,1),(1,0) (0,0),(0,1),(1,1),(1,0)四个虫子A追B&#xff0c;B追C&#xff0c;C追D&#xff0c;D追A四个速度相同 …

XTuner 微调 LLM:1.8B、多模态、Agent——笔记

XTuner 微调 LLM&#xff1a;1.8B、多模态、Agent——笔记 一、Finetune 简介1.1、两种 Finetune 范式1.2、一条数据的一生1.2.1、标准格式数据1.2.2、添加对话模板1.2.3、LoRA & QLoRA 二、XTuner2.1、XTuner 简介2.2、LLaMA-Factory vs XTuner2.3、XTuner 数据引擎2.3.1、…