Day38 力扣动态规划 :70.爬楼梯 |322. 零钱兑换 |279. 完全平方数

Day38 力扣动态规划 :70.爬楼梯 |322. 零钱兑换 |279. 完全平方数

  • 70. 爬楼梯 (进阶)
    • 第一印象
    • 看完题解的思路
    • 实现中的困难
    • 感悟
    • 代码
  • 322. 零钱兑换
    • 第一印象
      • dp数组
      • 递推公式
      • 初始化
      • 遍历顺序
      • 如果凑不出来返回 -1
    • 看完题解的思路
    • 实现中的困难
    • 感悟
    • 代码
  • 279.完全平方数
    • 第一印象
    • 看完题解的思路
    • 实现中的困难
    • 感悟
    • 代码

70. 爬楼梯 (进阶)

这道题目 爬楼梯之前我们做过,这次再用完全背包的思路来分析一遍

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

第一印象

用完全背包的思路重新做一遍爬楼梯。

每次可能爬1或2个,这个就是物品,而且可以数量无限,所以是完全背包。

物品的重量是1和2,价值也是重量。

要爬n阶,所以背包的大小是n。

也就是拿物品装满背包有多少种方法。

接下来要看排列还是组合呢?

比如爬3阶,先爬1再爬2 和 先爬2再爬1是两种,所以是排列。

直接开做!!

看完题解的思路

就是用完全背包的思路去做一遍爬楼梯。

这里每次爬的台阶数量可以变成 1 2 3 …… m,也就是有 m 个物品。

而本题只是 1 2 ,两个物品

实现中的困难

没有苦难

感悟

牛逼啊完全背包!!!

代码

class Solution {public int climbStairs(int n) {//爬 i 阶楼梯有 dp[i] 种方法int[] dp = new int[n + 1];//初始化dp[0] = 1;//先背包再物品,排列for (int j = 1; j < dp.length; j++) {for (int i = 1; i <= 2; i++) {if ( j >= i) {dp[j] += dp[j - i];}}//打印dp数组for (int k = 0; k < dp.length; k++) {System.out.print(dp[k] + "  ");}System.out.println();}return dp[n];}
}

322. 零钱兑换

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

这句话结合本题 大家要好好理解。 视频讲解:https://www.bilibili.com/video/BV14K411R7yv
https://programmercarl.com/0322.%E9%9B%B6%E9%92%B1%E5%85%91%E6%8D%A2.html

第一印象

我试试

dp数组

凑成 i 元需要的最少硬币数量是 dp[i]

递推公式

dp[j] = min( dp[j], dp[j - coins[I] ] + 1 )

初始化

画出二维数组体验一下过程

首先,dp[0] = 0是肯定的,因为凑出0元就是0种方式,题目的实例也告诉我们了。

其他元素呢?按照习惯 还是dp[i] = 0. 但这里不行了,因为每次都取最小是,如果初始化都是 0 的话,每次取dp[j] 和dp[j-coins[i]] + 1 小的那个,那么dp数组永远都是 0 了。因为dp的含义是凑成 i 元最少需要dp[i] 个硬币。

所以dp数组要初始化为最大,一开始我选择了MAX_VALUE,但其实不合理,后面再说。

遍历顺序

硬币数量和组合排列没关系,我觉得for循环里外都行,我选择了最习惯的组合 —— 先物品再背包

如果凑不出来返回 -1

怎么看凑不出来呢??拿coins 只有2,amount=3 来举例子。

一开始数组都是MAX,从 j=2开始处理,dp[2] = min(dp[2], dp[0] + 1)

所以dp[2]更新成了1

dp[3] = min ( dp[3], dp[1] + 1 )

dp[1] 和dp[3] 都是MAX,那么dp[1] + 1岂不是突破 MAX 了?这就不合理了。

所以数组初始化应该是MAX - 1. 这样的话,dp[1] + 1= MAX, dp[3] = MAX - 1. 选择更小的,dp[3] 更新为MAX - 1.

既保证了不会溢出整形,也保证了数组最大的是MAX - 1,这样就算遇到下一个dp[3] + 1的时候,也不会溢出。

看完题解的思路

我照亮照亮题解是不是这么回事

确实在遍历顺序那里,两个 for 循环内外都可以,因为和顺序没关系。

我觉得可能是这样,一个是逻辑上没关系,另者,递推公式是取最小而不是累加,顺序就不会影响取最小这个计算过程。

因为1 1 2 和 2 1 1,对于几种方法的dp数组来说排列的话是2种,组合的话是1张

但如果dp数组记录的是最小硬币数量,对于dp数组来说,记录的都是 3.

同样,dp数组如果记录的是最大价值,对于dp数组来说,记录的都是那个价值。

剩下的和我想的一样

他是用下面这样的方式避免了MAX溢出

//只有dp[j-coins[i]]不是初始最大值时,该位才有选择的必要if (dp[j - coins[i]] != max) {//选择硬币数目最小的情况dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);}

实现中的困难

避免max溢出就行了

感悟

我真是天才

代码

class Solution {public int coinChange(int[] coins, int amount) {int[] dp = new int[amount + 1];//初始化dp[0] = 0;for (int i = 1; i < dp.length; i++) {dp[i] = Integer.MAX_VALUE - 1;}for (int i = 0; i < coins.length; i++) {for (int j = coins[i]; j < dp.length; j++) {dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);}}if (dp[amount] == Integer.MAX_VALUE - 1) return -1;return dp[amount];}
}

279.完全平方数

本题 和 322. 零钱兑换 基本是一样的,大家先自己尝试做一做
视频讲解:https://www.bilibili.com/video/BV12P411T7Br
https://programmercarl.com/0279.%E5%AE%8C%E5%85%A8%E5%B9%B3%E6%96%B9%E6%95%B0.html

第一印象

背包大小是 n

完全平方数是每个物品

我得先创建这个物品的数组才行。

但是多大呢?

o ,体力给了,背包最多10000大小,那么完全平方数到10000就行,也就是100个完全平方数

总之,完全背包所以正序遍历,和顺序没关系两个for循环里外都行。

我写写试试。

样例跑过了,但是n比较大的时候就超过时间限制了,比如n=6665.

看完题解的思路

我看看怎么优化

哦,原来不用生成那个物品数组,这样会让for循环每次都做的很大。

诶,我按题解的写法怎么也超时了。

我把打印数组的地方去掉了,就通过了?????

尝试了一下,按我自己的方法,去掉打印数组,也是不超时的。好奇怪啊。

实现中的困难

没啥苦难

感悟


不知道为什么如果吧打印dp数组的那个拿出来,就会超时了。

代码

class Solution {public int numSquares(int n) {//dp数组int[] dp = new int[n + 1];//初始化Arrays.fill(dp, Integer.MAX_VALUE);dp[0] = 0;//递推公式for (int i = 1; i * i <= n; i++) {for (int j = i * i; j < dp.length; j++) {dp[j] = Math.min(dp[j], dp[j - i * i] + 1);}// //打印dp数组// for (int k = 0; k < dp.length; k++) {//     System.out.print(dp[k] + "  ");// }// System.out.println();}return dp[n];}
}

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

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

相关文章

【漏洞复现】酒店宽带运营系统RCE

漏洞描述 安美数字 酒店宽带运营系统 server_ping.php 远程命令执行漏洞 免责声明 技术文章仅供参考&#xff0c;任何个人和组织使用网络应当遵守宪法法律&#xff0c;遵守公共秩序&#xff0c;尊重社会公德&#xff0c;不得利用网络从事危害国家安全、荣誉和利益&#xff…

一文了解GC垃圾回收

一文了解GC垃圾回收 1 判断一个对象为垃圾对象的方法 引用计数法(弃用) 可达性分析算法 是否有指向GC root 的引用链&#xff0c;如果有&#xff0c;不是垃圾对象 ---->GC roo:即rt.jar包中内容 2 内存泄漏与内存溢出区别 泄漏&#xff1a;原本需要被回收的对象&#…

C++系列之list的模拟实现

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; list的节点类 template struct list_Node { public: list_Node* _prev; list_…

关于本地项目上传到gitee的详细流程

如何上传本地项目到Gitee的流程&#xff1a; 1.Gitee创建项目 2. 进入所在文件夹&#xff0c;右键点击Git Bash Here 3.配置用户名和邮箱 在gitee的官网找到命令&#xff0c;注意这里的用户名和邮箱一定要和你本地的Git相匹配&#xff0c;否则会出现问题。 解决方法如下&…

linux上java -jar方式运行项目及输出文件nohup.out的清理, linux上定时器的用法

linux上java -jar方式运行项目及输出文件nohup.out的清理&#xff0c; linux上定时器的用法 linux上java -jar方式运行定期自动清理nohup.out文件的内容**验证**定时器crontab使用时注意事项 linux上java -jar方式运行 参考&#xff1a;https://blog.csdn.net/qq_42169450/arti…

2023 MathorCup(妈妈杯) 数学建模挑战赛B题完整解题思路+模型+代码

2023妈妈杯数学建模B题完整版思路、模型代码已出&#xff01;&#xff01;&#xff01; 云顶数模最新完整版解题思路、模型代码&#xff0c;供大家参考~~ B题目 解题思路 详细模型解析&#xff1a;

android中集成ffmpeg

在java程序中集成ffmpeg库&#xff1a; 编写JNI接口编译 FFmpeg 库和 JNI 接口在 Java 代码中加载 JNI 接口 在android程序中也需要一样的步骤。或者用一些别人已经编译好的一些库&#xff0c;比如android中的ffmpeg-android-java或者mobile-ffmpeg

原型、原型对象、原型链

1、什么是原型&#xff08;隐式原型、显式原型&#xff09; JavaScript 的所有对象中都有一个私有属性&#xff0c;我们一般称之为隐式原型&#xff08;__proto__&#xff09;&#xff0c;它指向的是构建出这个实例的类的显式原型&#xff08;prototype&#xff09;&#xff0c…

开启CETOS 裸奔了一年的服务器开启firewall防火墙

记录一下关于firewall&#xff0c;博主非运维专家或服务器专家。 背景 客户有一台裸奔运行了一年多的系统有公网但发现没有开防火墙&#xff0c;iptables和firewall均是关闭状态&#xff0c;通过扫描发现很多漏洞。根据客户要求对端口进行重新梳理且关闭不必要或有潜在风险的…

ubuntu安装nps客户端

Ubuntu安装nps客户端 1.什么是nps内网穿透&#xff1f;2.设备情况3.下载客户端3.链接服务端3.1、无配置文件模式3.2、注册到系统服务(启动启动、监控进程) 1.什么是nps内网穿透&#xff1f; nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发…

基于 ResNet18 架构使用 deformable convolution的车道线检测

下面是一个基于关键点的车道线检测网络的 PyTorch 代码示例&#xff0c;其中使用了 deformable convolution。该代码示例基于 ResNet18 架构&#xff0c;可以根据实际情况进行修改。 首先&#xff0c;需要导入必要的库和模块&#xff1a; import torch import torch.nn as nn…

云端代码编辑器Atheos

什么是 Atheos &#xff1f; Atheos是一个基于 Web 的 IDE 框架&#xff0c;占用空间小且要求最低&#xff0c;构建于 Codiad 之上&#xff0c;不过 Atheos 已从原始 Codiad 项目完全重写&#xff0c;以利用更现代的工具、更简洁的代码和更广泛的功能。 注意事项 群晖内核版本太…

React hooks的闭包陷阱

react hooks 陷阱 hooks必须放在函数顶层&#xff0c; 不能在条件分支和方法内 1、useState陷阱 异步陷阱 function Index() {const [count, setCount] useState(0)function add(){setCount( count 1 )console.log(count); // 0}return (<div><span>{count}…

浅谈中国汽车充电桩行业市场状况及充电桩选型的介绍

安科瑞虞佳豪 车桩比降低是完善新能源汽车行业配套的一大重要趋势&#xff0c;目前各国政府都在努力推进政策&#xff0c;通过税收减免、建设补贴等措施提升充电桩建设速度&#xff0c;以满足新能源汽车需求。 近年来&#xff0c;在需求和技术的驱动下&#xff0c;充电桩的平…

Mac怎么删除文件和软件?苹果电脑删除第三方软件方法

Mac删除程序这个话题为什么一直重复说或者太多人讨论呢&#xff1f;因为如果操作不当&#xff0c;可能会导致某些不好的影响。因为Mac电脑如果有太多无用的应用程序&#xff0c;很有可能会拖垮Mac系统的运行速度。或者如果因为删除不干净&#xff0c;导致残留文件积累在Mac电脑…

Jmeter的接口自动化测试

在去年实施了一年的三端&#xff08;PC、无线M站、无线APP【Android、IOS】&#xff09;后&#xff0c;今年7月份开始&#xff0c;我们开始进行接口自动化的实施&#xff0c;目前已完成了整个框架的搭建以及接口的持续测试集成。今天做个简单的分享。 在开始自动化投入前&#…

第14期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练 Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

vscode 保存 “index.tsx“失败: 权限不足。选择 “以超级用户身份重试“ 以超级用户身份重试。

vscode 保存 "index.tsx"失败: 权限不足。选择 “以超级用户身份重试” 以超级用户身份重试。 操作&#xff1a;mac在文件夹中创建文件&#xff0c;sudo 创建umiJs项目 解决&#xff1a;修改文件夹权限 右键文件夹

STM32F103单片机内部RTC实时时钟驱动程序

一、STM32f103系列RTC功能 RTC实时时钟功能是嵌入式软件开发中比较常用的功能&#xff0c;一般MCU的RTC功能都带有年月日时间寄存器&#xff0c;比如STM32F4xx系列&#xff0c;RTC描述如下&#xff1a; 可见F4系列的RTC功能比较强大&#xff0c;设置好初始时间后&#xff0c;读…

NodeJS爬取墨刀上的设计图片

背景 设计人员分享了一个墨刀的原型图&#xff0c;但是给的是只读权限&#xff0c;无法下载其中的素材&#xff1b;开发时想下载里面的一张动图&#xff0c;通过浏览器的F12工具在页面结构找到了图片地址。 但是浏览器直接访问后发现没权限&#xff1a; Nginx 的 403 页面。。…