代码随想录算法训练营第45天| 70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数

JAVA代码编写

70. 爬楼梯(进阶版)

卡码网:57. 爬楼梯(第八期模拟笔试)

题目描述

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

每次你可以爬至多m (1 <= m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

输入描述

输入共一行,包含两个正整数,分别表示n, m

输出描述

输出一个整数,表示爬到楼顶的方法数。

输入示例
3 2
输出示例
3
提示信息
数据范围:
1 <= m < n <= 32;
当 m = 2,n = 3 时,n = 3 这表示一共有三个台阶,m = 2 代表你每次可以爬一个台阶或者两个台阶。
此时你有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶段
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

教程:https://programmercarl.com/0070.%E7%88%AC%E6%A5%BC%E6%A2%AF%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85%E7%89%88%E6%9C%AC.html#%E6%80%9D%E8%B7%AF

方法一:动态规划

思路:和70. 爬楼梯很像,基础的是每次只能走1个或2个台阶,现在改成能走1-m中任意一个台阶。问有多少种方法走完n阶楼梯。

步骤

  1. 定义dp数组:dp[j]: 爬到第j层楼梯,有dp[j]种方法

  2. 递推公式:dp[j] = dp[j - 1] + dp[j - 2] + … +dp[j - m]

    • dp[j - 1],上j-1层楼梯,有dp[j - 1]种方法,那么再1步跳一个台阶不就是dp[j]了么。
    • dp[j - 2],上j-2层楼梯,有dp[j - 2]种方法,那么再2步跳两个台阶不就是dp[j]了么。
    • dp[j - m],上j-m层楼梯,有dp[j - m]种方法,那么再m步跳两个台阶不就是dp[j]了么。
      可以这样理解。因为每次只能走1个楼梯或2个楼梯…或m个楼梯,那么我们要走j个楼梯,可以从第j-m个楼梯,再走m个楼梯;…;也可以从第j-1个楼梯,再走1个楼梯。所以dp[j] = dp[j - 1] + dp[j - 2] + … +dp[j - m]
  3. dp数组初始化:dp[1]=1,dp[2]=2

  4. 确定遍历顺序:遍历n,再遍历m

  5. 举例推导dp数组n=4,m=2

在这里插入图片描述

简单来说,dp[j]等于前m个dp的和,这里的dp[4]=dp[3]+dp[2],刚好是2个的和。

复杂度分析

  • 时间复杂度:O(n * m)
  • 空间复杂度:O(n)
import java.util.Scanner;class Solution{public static void main(String [] args){Scanner sc = new Scanner(System.in);int m, n;while (sc.hasNextInt()) {// 从键盘输入参数,中间用空格隔开n = sc.nextInt();m = sc.nextInt();// 求排列问题,先遍历背包再遍历物品int[] dp = new int[n + 1];dp[0] = 1;for (int j = 1; j <= n; j++) {for (int i = 1; i <= m; i++) {if (j - i >= 0) dp[j] += dp[j - i];}}System.out.println(dp[n]);}}
}

322. 零钱兑换

给你一个整数数组 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] <= 231 - 1
  • 0 <= amount <= 104

教程:https://programmercarl.com/0322.%E9%9B%B6%E9%92%B1%E5%85%91%E6%8D%A2.html

方法一:动态规划

思路:五步曲

步骤

  1. 定义dp [j]:凑成和为amount的最少硬币个数为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数组初始化:dp[0] =0,考虑到递推公式的特性,dp[j]必须初始化为一个最大的数,否则就会在min(dp[j - coins[i]] + 1, dp[j])比较的过程中被初始值覆盖。

  4. 确定遍历顺序:

    本题求钱币最小个数,那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数

    所以本题并不强调集合是组合还是排列。

    如果求组合数就是外层for循环遍历物品,内层for遍历背包

    如果求排列数就是外层for遍历背包,内层for循环遍历物品

  5. 举例推导dp数组,

    以输入:coins = [1, 2, 5], amount = 5为例

在这里插入图片描述

复杂度分析

  • 时间复杂度:O(n * amount),n 为coins长度
  • 空间复杂度:O(amount)
class Solution {public int coinChange(int[] coins, int amount) {int max = Integer.MAX_VALUE;int[] dp = new int[amount + 1];//初始化dp数组为最大值for (int j = 0; j < dp.length; j++) {dp[j] = max;}//当金额为0时需要的硬币数目为0dp[0] = 0;for (int i = 0; i < coins.length; i++) {//正序遍历:完全背包每个硬币可以选择多次for (int j = coins[i]; j <= amount; j++) {//只有dp[j-coins[i]]不是初始最大值时,该位才有选择的必要if (dp[j - coins[i]] != max) {//选择硬币数目最小的情况dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);}}}return dp[amount] == max ? -1 : dp[amount];}public static void main(String[] args) {Solution solution = new Solution();solution.coinChange(new int[] {1,2,5},5);}
}

从贪心的角度看,每次放最大的硬币,一直放,直到amount剩下为amount%最大硬币值,接着放次大或能直接整除的硬币。

class Solution {public int coinChange(int[] coins, int amount) {if (amount == 0) return 0;if (coins.length == 1 && amount % coins[0] != 0) return -1;int count = 0;Arrays.sort(coins);for (int i = coins.length - 1; i >= 0; i--) {count += amount / coins[i];amount = amount % coins[i];if (amount == 0) {return count;}}return -1;}
}

但是这个代码不能通过,贪心不能通过局部最优获取全局最优。

279. 完全平方数

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,14916 都是完全平方数,而 311 不是。

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 104

教程:https://programmercarl.com/0279.%E5%AE%8C%E5%85%A8%E5%B9%B3%E6%96%B9%E6%95%B0.html#_279-%E5%AE%8C%E5%85%A8%E5%B9%B3%E6%96%B9%E6%95%B0

方法一:动态规划

思路:完全平方数就是物品(可以无限件使用),凑个正整数n就是背包,问凑满这个背包最少有多少物品?

完全背包

步骤

  1. 定义dp [j]:和为j的完全平方数的最少数量为dp[j]

  2. 递推公式:

    dp[j] 可以由dp[j - i * i]推出, dp[j - i * i] + 1 便可以凑成dp[j]。

    此时我们要选择最小的dp[j],所以递推公式:dp[j] = min(dp[j - i * i] + 1, dp[j]);

  3. dp数组初始化:dp[0] =0,dp[j]赋最大值

  4. 确定遍历顺序:

    两者都可:

    如果求组合数就是外层for循环遍历物品,内层for遍历背包

    如果求排列数就是外层for遍历背包,内层for循环遍历物品

  5. 举例推导dp数组,

    已输入n为5例,dp状态图如下:

279.完全平方数

复杂度分析

  • 时间复杂度:O(n*sqrt(n))
  • 空间复杂度:O(n)
class Solution {// 版本一,先遍历物品, 再遍历背包public int numSquares(int n) {int max = Integer.MAX_VALUE;int[] dp = new int[n + 1];//初始化for (int j = 0; j <= n; j++) {dp[j] = max;}//如果不想要寫for-loop填充數組的話,也可以用JAVA內建的Arrays.fill()函數。//Arrays.fill(dp, Integer.MAX_VALUE);//当和为0时,组合的个数为0dp[0] = 0;// 遍历物品for (int i = 1; i * i <= n; i++) {// 遍历背包for (int j = i * i; j <= n; j++) {//if (dp[j - i * i] != max) {dp[j] = Math.min(dp[j], dp[j - i * i] + 1);//}//不需要這個if statement,因爲在完全平方數這一題不會有"湊不成"的狀況發生( 一定可以用"1"來組成任何一個n),故comment掉這個if statement。}}return dp[n];}
}class Solution {// 版本二, 先遍历背包, 再遍历物品public int numSquares(int n) {int max = Integer.MAX_VALUE;int[] dp = new int[n + 1];// 初始化for (int j = 0; j <= n; j++) {dp[j] = max;}// 当和为0时,组合的个数为0dp[0] = 0;// 遍历背包for (int j = 1; j <= n; j++) {// 遍历物品for (int i = 1; i * i <= j; i++) {dp[j] = Math.min(dp[j], dp[j - i * i] + 1);}}return dp[n];}
}

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

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

相关文章

菜鸟学习日记(python)——推导式

python中的推导式是一种独特的数据处理方式&#xff0c;可以从一个数据序列去构建另一个新的数据序列的结构体。 它包括以下推导式&#xff1a; 列表&#xff08;list&#xff09;推导式字典&#xff08;dict&#xff09;推导式集合&#xff08;set&#xff09;推导式元组&am…

Multi-Cell Downlink Beamforming: Direct FP, Closed-Form FP, Weighted MMSE

这里写自定义目录标题 Direct FPClosed-Form FPthe Lagrangian functionthe Lagrange dual function: maximizing the Lagrangianthe Lagrange dual problem: minimizing the Lagrange dual functionClosed-Form FP Weighted MMSE原论文 Lagrange dual5.1.1 The Lagrangian5.1.…

阿里云服务器经济型、通用算力型、计算型、通用型、内存型实例区别及选择参考

当我们通过阿里云的活动购买云服务器会发现&#xff0c;相同配置的云服务器往往有多个不同的实例可选&#xff0c;而且价格差别也比较大&#xff0c;例如同样是4核8G的配置的云服务器&#xff0c;经济型e实例活动价格只要1500.48/1年起&#xff0c;通用算力型u1实例要1795.97/1…

nvidia安装出现7-zip crc error解决办法

解决办法&#xff1a;下载network版本&#xff0c;重新安装。&#xff08;选择自己需要的版本&#xff09; 网址&#xff1a;CUDA Toolkit 12.3 Update 1 Downloads | NVIDIA Developer 分析原因&#xff1a;local版本的安装包可能在下载过程中出现损坏。 本人尝试过全网说的…

linux 系统安全基线 安全加固操作

目录 用户口令设置 root用户远程登录限制 检查是否存在除root之外UID为0的用户 ​​​​​​​root用户环境变量的安全性 ​​​​​​​远程连接的安全性配置 ​​​​​​​用户的umask安全配置 ​​​​​​​重要目录和文件的权限设置 ​​​​​​​找未授权的SUID…

json转yolo格式

json转yolo格式 视觉分割得一些标注文件是json格式&#xff0c;比如&#xff0c;舌头将这个舌头区域分割出来&#xff08;用mask二值图的形式&#xff09;&#xff0c;对舌头的分割第一步是需要检测出来&#xff0c;缺少数据集&#xff0c;可以使用分割出来的结果&#xff0c;将…

无公网IP环境如何SSH远程连接Deepin操作系统

文章目录 前言1. 开启SSH服务2. Deppin安装Cpolar3. 配置ssh公网地址4. 公网远程SSH连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 前言 Deepin操作系统是一个基于Debian的Linux操作系统&#xff0c;专注于使用者对日常办公、学习、生活和娱乐的操作体验的极致&#xff0…

数据仪表盘设计:可视化数据指标和报告

写在开头 在信息爆炸的时代,数据不再是简单的数字和图表,而是一种有机的信息体系。如何将这些琳琅满目的数据以一种直观而高效的方式展示,成为企业决策者和分析师们共同关注的问题。本文将带您深入学习如何设计和创建数据仪表盘,使数据指标和报告以一目了然的方式呈现。 …

Python---time库

目录 时间获取 时间格式化 程序计时 time库包含三类函数&#xff1a; 时间获取&#xff1a;time() ctime() gmtime() 时间格式化&#xff1a;strtime() strptime() 程序计时&#xff1a;sleep() perf_counter() 下面逐一介绍&#…

H3.3K27M弥漫性中线胶质瘤的反义寡核苷酸治疗

今天给同学们分享一篇实验文章“Antisense oligonucleotide therapy for H3.3K27M diffuse midline glioma”&#xff0c;这篇文章发表在Sci Transl Med期刊上&#xff0c;影响因子为17.1。 结果解读&#xff1a; CRISPR-Cas9消耗H3.3K27M恢复了H3K27三甲基化&#xff0c;并延…

Echarts地图案例及常见问题

前言 ECharts 是一个使用 JavaScript 实现的开源可视化库,它可以帮助用户以简单的方式创建复杂的时间序列、条形图、饼图、地图等图形。 Echarts绘制地图的案例 展示了中国各省份的人口数量 var myChart = echarts.init(document.getElementById(main)); var option = {t…

【TailwindCSS】

TailwindCSS作为一种现代化的CSS框架&#xff0c;以其高度的定制性和灵活性受到前端开发者的青睐。本文旨在提供一份详细的TailwindCSS使用教程&#xff0c;特别适用于Vite和Vue框架的组合。 我们将从安装开始&#xff0c;深入探讨如何在项目中有效利用TailwindCSS的各项功能&…

在AWS Lambda上部署标准FFmpeg工具——Docker方案

大纲 1 确定Lambda运行时环境1.1 Lambda系统、镜像、内核版本1.2 运行时1.2.1 Python1.2.2 Java 2 启动EC23 编写调用FFmpeg的代码4 生成docker镜像4.1 安装和启动Docker服务4.2 编写Dockerfile脚本4.3 生成镜像 5 推送镜像5.1 创建存储库5.2 给EC2赋予角色5.2.1 创建策略5.2.2…

【带头学C++】----- 九、类和对象 ---- 9.10 C++设计模式之单例模式设计

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️麻烦您点个关注&#xff0c;不迷路❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️ 目 录 9.10 C设计模式之单例模式设计 举例说明&#xff1a; 9.10 C设计模式之单例模式设计 看过我之前的文章的&#xff0c;简单讲解过C/Q…

遥测终端机RTU:实现远程监测和控制的重要工具

遥测终端机RTU对设备进行远程监测和控制&#xff0c;支持采集和传输数据&#xff0c;以实现对工业过程、公用事业、水文和环境的监测和管理。 遥测终端机RTU工作原理 计讯物联遥测终端机RTU通过网口、串口进行传感器/设备等现场数据采集&#xff0c;将其转换为数字信号&#xf…

【LeetCode】202. 快乐数

202. 快乐数 难度&#xff1a;简单 题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变…

高校网站建设的效果如何

高校有较高的信息承载需求、招生宣传、学校内容呈现、内部消息触达等需求&#xff0c;对高校来说&#xff0c;如今互联网深入生活各个场景&#xff0c;无论学校发展、外部拓展还是内部师生互动、通知触达等都需要完善。 除了传统传单及第三方平台展示外&#xff0c;学校构建属…

C#-数组池减少GC工作

数组池减少GC工作 通过ArrayPool类&#xff08;名称空间System.Buffers&#xff09;使用数组池&#xff0c;可减少垃圾收集器的工作&#xff0c;ArrayPool管理一个数组池&#xff0c;数组可以从这租借&#xff0c;并返回池中&#xff0c;内存在ArrayPool中管理。 创建ArrayPool…

Html5响应式全开源网站建站源码系统 附带完整的搭建教程

Html5响应式全开源网站建站源码系统是基于Html5、CSS3和JavaScript等技术开发的全开源网站建站系统。它旨在为初学者和小型企业提供一套快速、简便的网站建设解决方案。该系统采用响应式设计&#xff0c;可以自适应不同设备的屏幕大小&#xff0c;提高用户体验。同时&#xff0…

Clean My Mac X2024解锁完整版本

Clean My Mac X是Mac上一款美观易用的系统优化清理工具&#xff0c;也是小编刚开始用Mac时的装机必备。垃圾需要时时清&#xff0c;电脑才能常年新。Windows的垃圾清理工具选择有很多&#xff0c;但是Mac的清理工具可选择的就很少。 今天给大家推荐大名鼎鼎的Clean My Mac X&a…