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

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

打家劫舍

198.打家劫舍
文章讲解:https://programmercarl.com/0198.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8D.html
题目链接:https://leetcode.cn/problems/house-robber/
视频讲解:https://www.bilibili.com/video/BV1Te411N7SX/

自己看到题目的第一想法

套动态规划五步骤去做,但是没想到切入点,卡在递推公式的推导以及dp的定义上。不知道该如何确定i的概念。

看完代码随想录之后的想法

动态规划去处理该题,i是输入元素的下标,然后递推公式按照i这个索引的元素放不放去推导出来,具体实现:

  • 定义dp数组概念:dp[i]为从0-i个元素中选取多个元素,使这些元素的和最大,同时要满足题目不能选相邻元素的规则。
  • 确定递推公式:递推公式的确定可以从选i和不选i来推导
    • 选i:dp[i]=dp[i-2] + nums[i]。这里用dp[i-2]是因为选了i之后就不能选i-1了。
    • 不选i:dp[i] = dp[i-1]。这里dp[i-1]不一定会选i-1,要多去回顾dp[i]的概念,这里是指从0到i-1中选取多个元素,使这些元素的和最大。
    • 根据选i和不选i最终可以得到推导公式: dp[i] = Math.max(dp[i-2] + nums[i],dp[i-1]);
  • 确定初始化值:dp[0] = nums[0]。dp[1] = Math.max(nums[0],nums[1]);其他元素的值因为是从小到大推的,后面的值由前面推导而来,因此可以直接初始化为0。
  • 确定遍历顺序:因为递推公式是从小到大,所以遍历顺序也从小到大。
  • 打印值

自己实现过程中遇到哪些困难

遍历的时候,i的取值没确定下来,是i<=nums.length还是i<nums.length。
这里思考了一下,因为最终求得后的dp数组要返回的值应该是nums的最后一个元素的位置,因此应该返回dp[nums.length - 1]。并且在遍历过程中,p[i] = Math.max(dp[i-2] + nums[i],dp[i-1]),nums[i]也只能到达i=nums.length - 1,因此这里的循环处理逻辑为i<nums.length。最终代码:

 public int rob(int[] nums) {if(nums.length == 1){return nums[0];}int[] dp = new int[nums.length];dp[0] = nums[0];dp[1] = Math.max(nums[0],nums[1]);for(int i = 2; i < nums.length; i++){dp[i] = Math.max(dp[i-1],dp[i-2] + nums[i]);}return dp[nums.length - 1];}

这道题的核心就是dp[i]的概念和递推公式的确定。

打家劫舍II

213.打家劫舍II 
文章讲解:https://programmercarl.com/0213.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8DII.html
题目链接:https://leetcode.cn/problems/house-robber-ii/
视频讲解:https://www.bilibili.com/video/BV1oM411B7xq/

自己看到题目的第一想法

整体思路和打家劫舍第一步一样,区别就是如果是环形的话 那0位置的元素和最后位置的元素不能共存。
这里分2钟场景,一去掉头,二去掉尾,然后看一或者二求出来哪个更大。

看完代码随想录之后的想法

整体方法一样,这里和自己的想法有区别的是自己的想法是做2个nums数组做截取得到[0,length - 1]和[1,length],而代码随想录里是用2个循环去处理。

自己实现过程中遇到哪些困难

初始化值的赋值方式和遍历循环i的初始值和结尾值没确定。
最终代码:

public int rob(int[] nums,int start,int end){if (end == start) return nums[start];int[] dp = new int[nums.length];dp[start] = nums[start];dp[start + 1] = Math.max(nums[start],nums[start + 1]);for(int i = start + 2; i <= end; i++){dp[i] = Math.max(dp[i-2] + nums[i],dp[i - 1]);}return dp[end];
}

打家劫舍III

337.打家劫舍III
文章讲解:https://programmercarl.com/0337.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8DIII.html
题目链接:https://leetcode.cn/problems/house-robber-iii/
视频讲解:https://www.bilibili.com/video/BV1H24y1Q7sY/

自己看到题目的第一想法

二叉树一样,只是把循环改成树的遍历了,根节点不能打劫左右子节点。
树的遍历有前中后。中为处理计算,前后为递归。

看完代码随想录之后的想法

代码分成2种情况,偷父节点和不偷父节点。

暴力递归:
偷父节点则直接取父节点的值,不偷父节点取2个字节点的值的和。最终再使用Math.max把两种情况下的值做一个比较取大值。

动态规划:
使用一个长度为2的数组,0记录不选根节点的最大值,1记录选根节点的最大值。
树形dp,先搭后序遍历的框架,二叉树的递归需要回归下。
然后再在二叉树递归中增加动态规划逻辑。

public int rob(TreeNode root) {// 二叉树一样,只是把循环改成树的遍历了,根节点不能打劫左右子节点int[] result = backtracking(root);return Math.max(result[0],result[1]);
}
public int[] backtracking(TreeNode node){int[] dp = new int[2];// 递归三部曲// 终止条件if(node == null){return dp;}// 后序遍历int[] left = backtracking(node.left);int[] right = backtracking(node.right);// 选当前节点和不选当前节点// 选当前节点dp[0] = node.val + left[1] + right[1];// 不选当前节点dp[1] = Math.max(left[0],left[1]) + Math.max(right[0],right[1]);return dp;
}

今日收获&学习时长

这节课整体用的时间不多,大概1.5h。
今天回顾了一下树的遍历,整体还是做递归遍历结合前、中、后序遍历去做逻辑。
学习了打家劫舍的解题方法,整体处理的逻辑还是讨论当前节点抢还是不抢。如果抢了当前节点,两个孩子就不能动,如果没抢当前节点,就可以考虑抢左右孩子(注意这里说的是“考虑”)

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

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

相关文章

[C#]使用onnxruntime部署yolov8-onnx实例分割模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 是一个 SOTA 模型&#xff0c;它建立在以前 YOLO 版本的成功基础上&#xff0c;并引入了新的功能和改进&#xff0c;以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新…

Android Framework | Linux 基础知识:入门指南

Android Framework | Linux 基础知识&#xff1a;入门指南 进行Android Framework开发需要具备基本的Linux基本知识&#xff0c;下面是一份Linux基础知识入门指南&#xff0c;希望对你有所帮助&#xff01; 1. 简介 Linux 是一种免费、开源的操作系统&#xff0c;它是由芬兰…

文件高效复制与删除:轻松删除垃圾文件,让文件夹焕然一新!

你是否经常遇到文件复制繁琐、删除垃圾文件困难的问题&#xff1f;现在&#xff0c;我们为你提供了一款强大的文件高效复制与删除工具&#xff0c;让你轻松实现目标文件夹的整洁与高效&#xff01; 第一步&#xff0c;我们要打开目标文件夹&#xff0c;就会发现里面有很多其他的…

SCPMA最新研究论文推荐!中国移动玻色量子发布联合研究成果

《中国科学&#xff1a;物理学 力学 天文学》英文版(SCIENCE CHINA Physics, Mechanics & Astronomy, SCPMA)出版中移(苏州)软件技术有限公司闻经纬和钱岭团队与北京玻色量子文凯团队的研究成果&#xff0c;文章题为“Optical experimental solution for the multiway numb…

Python练习之列表两数之和

列表两数之和 给定一个已按照非递减顺序排列的整数数组numbers,请你从数组中找出两个数满足相加之和等于target 函数应该以长度为2的整数数组的形式返回这两个数的下标值。numnbers的下标值从1开始&#xff0c;所以答案数组应当满足1<answer[0]<answer[0]<numbers.len…

Android--Jetpack--Paging详解

不尝世间醋与墨&#xff0c;怎知人间酸与苦。 择一业谋食养命&#xff0c;等一运扭转乾坤。 你见过哪些令你膛目结舌的代码技巧&#xff1f; 文章目录 不尝世间醋与墨&#xff0c;怎知人间酸与苦。择一业谋食养命&#xff0c;等一运扭转乾坤。你见过哪些令你膛目结舌的代码技…

mycat 安装和水平分表

1.拉取需要创建docker版的mycat资源 # 下载对应的资源 git clone https://github.com/ruanjiayu/docker.mycat # 进入docker.mycat cd /home/cluster/mycat/docker.mycat # 构建镜像 docker-compose build 2.修改配置 vim config/mycat/schema.xml <?xml version"…

three.js gltf后处理颜色异常(伽马校正)

效果&#xff1a; 应用了伽马校正&#xff0c;好像效果不明显 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"><…

各类好用的API推荐,赶紧收藏

快递物流订阅与推送&#xff08;含物流轨迹&#xff09;&#xff1a;【物流订阅与推送、H5物流轨迹、单号识别】支持单号的订阅与推送&#xff0c;订阅国内物流信息&#xff0c;当信息有变化时&#xff0c;推送到您的回调地址。地图轨迹支持在地图中展示包裹运输轨迹。包括顺丰…

考特殊教师证需要哪些条件

想要从事特殊教育工作&#xff0c;首先需要具备特殊教师证。那么&#xff0c;考取特殊教师证需要哪些条件呢&#xff1f;下面我将从几个方面为大家详细解答。 需要具备相应的学历背景。一般来说&#xff0c;申请特殊教师证需要具备本科及以上学历&#xff0c;且需要具备教育学、…

玩转朋友圈!这样运营朋友圈吸睛又吸金!

朋友圈已成为现代社交媒体中不可或缺的平台&#xff0c;并且有很大的潜力用于营销和推广。那么如何才能让朋友圈在众多用户中脱颖而出&#xff0c;吸引眼球并提升商业效益呢&#xff1f;主要从以下几点出发&#xff1a; 首先&#xff0c;要想吸引关注&#xff0c;您需要在朋友…

Python 雷达图的绘制(极坐标图) (Matplotlib篇-14)

Python 雷达图的绘制(极坐标图) (Matplotlib篇-14)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

关闭MobaXterm等连接linux服务器的软件,依旧可以后台运行程序

linux screen 命令 &#xff08;1&#xff09;连接服务器&#xff0c;在服务器终端安装screen apt install screen &#xff08;2&#xff09;创建screen窗口&#xff0c;mm为窗口名。就可以在这里运行你的命令了 此时该窗口的状态变为 Attached screen -S mm &#xff08;3…

手把手教你,Selenium 遇见伪元素该如何处理?

Selenium 遇见伪元素该如何处理&#xff1f; 前言 问题发生 在很多前端页面中&#xff0c;大家会见到很多&#xff1a;:before、::after 元素&#xff0c;比如【百度流量研究院】&#xff1a; 比如【百度疫情大数据平台】&#xff1a; 以【百度疫情大数据平台】为例&#xff…

一文掌握文本语义分割:从朴素切分、Cross-Segment到阿里SeqModel

前言 之所以写本文&#xff0c;源于以下两点 在此文《基于LangChainLLM的本地知识库问答&#xff1a;从企业单文档问答到批量文档问答》的3.5节中&#xff0c;我们曾分析过langchain-chatchat项目中文本分割相关的代码&#xff0c;当时曾提到该项目中的文档语义分割模型为达摩…

MySQL日志管理 、备份与恢复

mysql日志管理 、备份与恢复 备份的主要目的是灾难恢复&#xff0c;备份还可以测试应用、回滚数据修改、查询历史数据、审计等。 而备份、恢复中&#xff0c;日志起到了很重要的作用 #######前言&#xff1a;日志⭐⭐ MySQL 的日志默认保存位置为 /usr/local/mysql/data ##配…

全面解析vcruntime140_1.dll无法继续执行代码问题

在使用电脑的过程中&#xff0c;我们可能会遇到各种问题&#xff0c;如“找不到vcruntime140_1.dll无法继续执行代码”。vcruntime140_1.dll是Visual C Runtime Library&#xff08;视觉C运行时库&#xff09;的一个组件&#xff0c;主要用于支持应用程序的运行。这个文件包含了…

【AI】DETR模型可视化操作

Detr作为目标检测的算法&#xff0c;不同于之前算法的就是注意力机制&#xff0c;注意力机制能够直观看出来模型对图像关注的点&#xff0c;这个直观到底怎么直观呢&#xff0c;我们只听别人说肯定是不行的&#xff0c;上手测试才是最好的方式&#xff0c;像论文中插图那样的使…

听GPT 讲Rust源代码--compiler(4)

File: rust/compiler/rustc_codegen_gcc/src/back/mod.rs rust/compiler/rustc_codegen_gcc/src/back/mod.rs 文件是 Rust 编译器的源代码中的一个模块&#xff0c;主要负责与 GCC&#xff08;GNU 编译器集合&#xff09;相关的后端代码生成。 在 Rust 编译器的架构中&#xff…

系统崩溃无U盘重装Win10系统的方法

用户反映自己电脑上的操作系统出现了崩溃问题&#xff0c;无法通过简单的操作解决问题&#xff0c;想重新安装正常的操作系统&#xff0c;但是没有U盘不知道要怎么操作才能安装好系统&#xff1f;接下来小编带来系统崩溃无U盘重装Win10系统的方法步骤介绍&#xff0c;用户们可以…