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

news2024/11/23 14:53:29

70. 爬楼梯(进阶版)

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

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

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

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

class Solution {
    public int climbStairs(int n) {
        int[] dp = new int[n + 1];
        int m = 2; //m表示最多可以爬m个台阶
        dp[0] = 1;

        for (int i = 1; i <= n; i++) { // 遍历背包
            for (int j = 1; j <= m; j++) { //遍历物品
                if (i >= j)  //當前的背包容量 大於 物品重量的時候,我們才需要記錄當前的這個裝得方法(方法數+)
			dp[i] += dp[i - j];
            }
        }
        return 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

示例 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

  • 动规五部曲

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

背包容量: 目标值

硬币:物品

问:装满这个背包,最少用多少件物品

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

2.确定递推公式

Math.min

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

3.初始化

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

其他下标对应的数值呢?

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

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

//初始化dp数组为最大值
        for (int j = 0; j < dp.length; j++) {
                dp[j] = Integer.MAX_VALUE;
        }

4.遍历顺序求

求最小的元素数量 ,不影响 都可以

5.打印dp数组

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

322.零钱兑换

代码:

class Solution {
    public int coinChange(int[] coins, int amount) {
        int[] dp=new int[amount+1];
        //初始化 其他下标  因为要求最小所以不能赋值为0  会被覆盖
        for (int j = 0; j < dp.length; j++) {
            dp[j] = Integer.MAX_VALUE;
        }
        dp[0]=0;
        for(int i=0;i<coins.length;i++){  //遍历物品
            for(int j=coins[i];j<=amount;j++){  //遍历背包
                if(dp[j - coins[i]] != Integer.MAX_VALUE){
                    // 如果dp[j - coins[i]]是初始值则跳过
                    dp[j]=Math.min(dp[j],dp[j-coins[i]]+1);
                }
            }
        }
        return dp[amount]==Integer.MAX_VALUE?-1:dp[amount];

    }
}

279.完全平方数

力扣题目链接

给定正整数 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

  • 动态规划五部曲

1.确定dp数组的含义

背包容量: 整数n

物品:完全平方数 i*i

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

dp[j]: 和为j时,完全平方数最少的数量为dp[j]

2.确定递推公式

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

每个元素的数值用i*i表示

3.初始化

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

其他下标对应的数值呢?

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

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

//初始化dp数组为最大值
        for (int j = 0; j < dp.length; j++) {
                dp[j] = Integer.MAX_VALUE;
        }

4.遍历顺序求

求最小的元素数量,不影响

5.打印dp数组

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

279.完全平方数

dp[0] = 0 dp[1] = min(dp[0] + 1) = 1 dp[2] = min(dp[1] + 1) = 2 dp[3] = min(dp[2] + 1) = 3 dp[4] = min(dp[3] + 1, dp[0] + 1) = 1 dp[5] = min(dp[4] + 1, dp[1] + 1) = 2

最后的dp[n]为最终结果。

代码:

class Solution {
    public int numSquares(int n) {
        int[] dp=new int[n+1];
        for(int j=0;j<=n;j++){
            dp[j]=Integer.MAX_VALUE;
        }
        dp[0]=0;
        for(int i=1;i*i<=n;i++){  //遍历物品
            for(int j=i*i;j<=n;j++){   //遍历背包  背包从物品大小开始
                dp[j]=Math.min(dp[j],dp[j-i*i]+1);  //为了下标不出现负数
            }
        }
        return dp[n];
    }
}

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

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

相关文章

系统架构设计高级技能 · 软件产品线

现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 点击进入系列文章目录 系统架构设计高级技能 软件产品线 一、产品线概述二、产品线的过程模型2.1 双生命…

AI绘画:StableDiffusion实操教程-诛仙-碧瑶(附高清图下载)

前段时间我分享了StableDiffusion的非常完整的教程&#xff1a;“AI绘画&#xff1a;Stable Diffusion 终极宝典&#xff1a;从入门到精通 ” 不久前&#xff0c;我与大家分享了StableDiffusion的全面教程&#xff1a;“AI绘画&#xff1a;Stable Diffusion 终极宝典&#xff…

微调 TrOCR – 训练 TrOCR 识别弯曲文本

TrOCR(基于 Transformer 的光学字符识别)模型是性能最佳的 OCR 模型之一。在我们之前的文章中,我们分析了它们在单行打印和手写文本上的表现。然而,与任何其他深度学习模型一样,它们也有其局限性。TrOCR 在处理开箱即用的弯曲文本时表现不佳。本文将通过在弯曲文本数据集上…

Canvas怎样修改线条的宽度、颜色和形状?

在Canvas中&#xff0c;线的默认颜色为黑色&#xff0c;宽度为lpx&#xff0c;但我们可以使用相关属性为线添加不同的样式。下面我们将从宽度、描边颜色、端点形状3方面详细讲解线条样式的设置方法。 1.设置线条宽度 使用lineWidth属性可以定义线的宽度&#xff0c;该属性的取…

第三方电脑安装小爱同学

首先下面这个是小爱同学的商店地址&#xff0c;如图1&#xff1a; 查看链接&#xff08;小爱同学 - Microsoft Store 应用程序&#xff09; 打开微软应用商店后到上面的网页点击获取 安装完成后 点击miservice 点击隐私协议勾选同意 打开小爱同学登录小米账号即可开始使用 2…

UG\NX CAM二次开发 设置工序切削区域 UF_CAMGEOM_append_item

文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 设置工序切削区域 UF_CAMGEOM_append_item 效果: 代码: static int init_proc(UF_UI_selection_p_t select, void* user_data) { int errorCode = 0; int num_triples = 1;//UF_UI_mask_…

打印剪刀手“耶”(V形)

用给定单个字符和首行宽度(奇数)&#xff0c; 打印首行宽度为给定奇数“V”字形状)。 (本笔记适合Py 推崇的插件字符串格式化的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全…

UG\NX CAM二次开发 设置安全平面的起点和法向 UF_CAM_set_auto_blank

文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 设置安全平面的起点和法向 UF_CAM_set_auto_blank 效果: 代码: void MyClass::do_it() { //获取加工环境tagtag_t setup_tag=NULL_TAG;UF_SETUP_ask_setup(&setup_tag);//返回当前工序导…

抓包工具Fiddler的下载与设置

1.在浏览器搜索Fiddler&#xff0c;找到下载Fiddler的官网‘ 2.选择Fiddler Classic 点击Learn more 3.填写邮箱信息进行下载 设置Fiddler可以对HTTPS协议进行抓包&#xff08;刚下载只能对HTTP进行抓包&#xff09; 1.点击Tools&#xff0c;选择Options&#xff0c;选择HTTP…

ChatGPT 太贵?一键部署自己的私有大模型

部署你的私有化对话机器人&#xff0c;只需要三步&#xff1a; 克隆 github 中文版 LLaMa repo下载 HuggingFace 13B 16K 完整模型启动对话窗口 没错&#xff0c;就是这么简单 我把这份操作指南&#xff0c;做成了一份 Jupyter Notebook 分享给大家&#xff0c;以下是链接&…

堆相关例子-排序最多移动k距离

题目&#xff1a; 一个几乎有序的数组。几乎有序是指&#xff1a;如果把数组排好序&#xff0c;每个数的移动距离一定不超过K&#xff0c;并且K一定远小于数组长度 分析&#xff1a; 给定的数组有上面的限制条件&#xff0c;根据条件可以分析得到&#xff1a; 对于前0-k个数…

java项目基于 SSM+JSP 的人事管理系统

java项目基于 SSMJSP 的人事管理系统 博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 大家好&#xff0c;今天和大家聊的是 Java 基于 SSM 的人事管理系统。…

李宏毅深度学习self-attentin学习笔记

self-attention 一、self-attention的起源二、self-attention网络架构三、multi-head self-attention四、positional encoding五、pytorch实现 一、self-attention的起源 self-attention初始也是用于解决seq2seq的问题。即input是一堆序列&#xff0c;而output也是一段长度固定…

【LeetCode: 210. 课程表 II:拓扑排序+图】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【C++】map值自定义key,value排序(含ccfcsp第四次认证第二题演示和map遍历方法)

如何自定义map排序 sort仅仅支持pair&#xff0c;vector&#xff0c;数组等排序&#xff0c;不支持对map的排序 所以如果想用sort对map排序的话&#xff0c;只需要把map转换为vector即可&#xff1a; map<int,int>res; res[1]1,res[2]2,res[3]3; vector<pair<in…

laravel部署api项目遇到问题总结

laravel线上部署问题 一、Ubuntu远程Mysql 61“Connection refused”二、Ubuntu更新php8三、线上部署Permission denied3.1、部署完之后访问域名出现报错&#xff1a;3.2、The /bootstrap/cache directory must be present and writable. 四、图片访问404五、git部署线上文件 一…

如何在linux系统下快速上手调试器gdb

1.什么是调试器&#xff1f; 调试器是一种帮助开发人员查看和修复程序错误的工具 2.gdb的作用和特点&#xff1f; gdb的作用 帮助开发人员寻找错误&#xff0c;并且提供了一系列的功能和工具进行调试 gdb的特点 源代码级调试多平台支持强大的调试功能拓展性强 3.gdb的基…

项目(智慧教室)第四部分,页面交互功能,WebServer建立与使用,

一。页面构思 1.标题栏 大标题&#xff1a;智慧教室管理系统 小标题&#xff1a;灯光&#xff0c;报警&#xff0c;风扇&#xff0c;温度&#xff0c;湿度&#xff0c;光照 2.样式设计 背景设置。字体设置&#xff08;字体大小&#xff0c;格式&#xff0c;颜色&#xff09; 3.…

多线程与高并发——并发编程(6)

文章目录 六、并发集合1 ConcurrentHashMap1.1 存储结构1.2 存储操作1.2.1 put方法1.2.2 putVal方法-散列算法1.2.3 putVal方法-添加数据到数组&初始化数组1.2.4 putVal方法-添加数据到链表1.3 扩容操作1.3.1 treeifyBin方法触发扩容1.3.2 tryPresize方法-针对putAll的初始…