代码随想录Day_48打卡

①、打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

事例:

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。

思路:

        使用动态规划,对于每个房间,只有两种选择,偷还是不偷,若选择偷的话,则只能加上前两个房间偷取的最大金额,即上一个房间不偷,若不偷,则为从第一个房间到前一个房间偷取的最大金额,两者取最大值即可。

动态规划:

        dp定义及含义:dp[j]表示从第一个房间到第j个房间能偷取的最大金额

        状态转移方程:dp[j] = Math.max(dp[j - 1],dp[j - 2] + nums[j])

        初始化:dp[0] = nums[0] 只能投第一个房间 dp[1] = Math.max(nums[0],num[1]),前两个房间就选个钱多的。

        遍历顺序:房间从小到大遍历

        dp[nums.length - 1]即为答案。

代码:

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

②、打家劫舍Ⅱ

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。

给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

事例:

输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。

思路:

        与上一题类似,只是首尾多了个环形判断,需要进行解环操作。可以将环截成两个链,如对第一家到最后第二家进行打劫,然后再从头开始,对第二家到最后一家进行打劫,最后返回两个打劫的最大值即可。打劫代码跟上题一致。

代码:

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

③、打家劫舍Ⅲ

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。

除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。

给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额 。

事例:

输入: root = [3,2,3,null,3,null,1]
输出: 7 
解释: 小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7

思路:

        这道题的社区结构变成了树形,对于树,我们得选择一种遍历方式,打劫该结点与否取决于左右孩子是否打劫的金额最大值,故可以采用递归,返回值为处理左右孩子的数据,以便后续判断,故选择后序遍历。

递归:

        使用后序遍历

        返回值:int[],约定int[0]为该不打劫该节点,int[1]为打劫该结点,返回参数可以直接给根结点构造成新参数,层层返回到最终结果。

        最后返回root[0],root[1]中的最大值即为答案。

动态规划:

        dp定义及含义:dp其实就是递归函数的返回值,其中dp[0]表示不打劫当前结点的最大金额,dp[1]表示打劫当前结点的最大金额。

        状态转移方程:构造dp数组,dp[0] = Math.max(leftDp[0],left[1]) + Math.max(rightDp[0],rightDp[1]),dp[1] = root.val + leftDp[0] + rightDp[1]

        初始化:遇到空节点时,返回new int[]{0,0}

        遍历顺序:后序遍历,因为根节点是否打劫需要根据左右孩子是否打劫

        最终返回的值为:根节点是否打劫的最大金额,返回其中的最大值即可。

代码:

public int rob(TreeNode root) {int[] resDp = dpRoot(root);int res = Math.max(resDp[0],resDp[1]);return res;}public int[] dpRoot(TreeNode root){if(root == null) return new int[]{0,0};int[] leftDp = dpRoot(root.left);int[] rightDp = dpRoot(root.right);int value1 = root.val + leftDp[0] + rightDp[0];int value0 = Math.max(leftDp[0],leftDp[1]) + Math.max(rightDp[0],rightDp[1]);return new int[]{value0,value1};}

参考:代码随想录 (programmercarl.com)

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

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

相关文章

STM32之17.PWM脉冲宽度调制

一LED0脉冲宽度调制在TIM14_CHI&#xff0c;先将LED&#xff08;PF9&#xff09;代码配置为AF推挽输出模式&#xff0c;将PF9引脚连接到TIM14&#xff0c; #include <stm32f4xx.h>static GPIO_InitTypeDef GPIO_InitStruct;void Led_init(void) {//打开端口F的硬件时钟&a…

Yolo系列-yolov2

YOLO-V2 更快&#xff01;更强&#xff01; YOLO-V2-BatchNormalization BatchNormalization&#xff08;批归一化&#xff09;是一个常用的深度神经网络优化技术&#xff0c;它可以将输入数据进行归一化处理&#xff0c;使得神经网络更容易进行学习。在YOLOv2中&#xff0c;B…

《C和指针》笔记11: external和internal链接属性

当组成一个程序的各个源文件分别被编译之后&#xff0c;所有的目标文件以及那些从一个或多个函数库中引用的函数链接在一起&#xff0c;形成可执行程序。然而&#xff0c;如果相同的标识符出现在几个不同的源文件中时&#xff0c;它们是像Pascal那样表示同一个实体&#xff1f;…

Apache StreamPark系列教程第二篇——项目打包和开发

一、项目打包 项目依赖maven、jdk8.0、前端(node、npm) //下载代码 git clone//maven打包相关内容 mvn -N io.takari:maven:wrapper //前端打包相关内容 curl -sL https://rpm.nodesource.com/setup_16.x | bash - yum -y install nodejs npm -v npm install -g pnpm默认是h2…

手把手教你搭建Serv-U FTP服务器共享文件并实现外网远程访问「无公网IP」

文章目录 1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装 3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 科技日益发展的今天&#xff0c;移动电子设备似乎成了我们生活的主角&#xff0c;智能…

TensorBoard的使用

TensorBoard&#xff1a;对图像进行变换 1. SummaryWriter的使用 ctrl类出现注释解析&#xff1a; 将条目直接log_dir写入要成为由TensorBoard使用。 “摘要编写器”类提供了一个高级 API 来创建事件文件&#xff0c;并在给定目录中添加摘要和事件。该类更新文件内容异步。…

Yolo系列-yolov3

YOLO-V3 这张图讲道理真的过分了&#xff01;&#xff01;&#xff01;我不是针对谁&#xff0c;在座的各位都是 终于到V3了&#xff0c;最大的改进就是网络结构&#xff0c;使其更适合小目标检测特征做的更细致&#xff0c;融入多持续特征图信息来预测不同规格物体 先验框更丰…

Linux TCP编程流程

一、TCP编程流程 TCP 提供的是面向连接的、可靠的、字节流服务。TCP的服务器端和客户端编程流程如下&#xff1a; 1.socket()方法 用来创建一个套接字&#xff0c;有了套接字就可以通过网络进行数据的收发。这也是为什么进行网络通信的程序首先要创建一个套接字。创建套接字时…

ASL芯片CS5366带DSC影像解压 替代PS186替代RTD2173替代AG9411 集睿致远方案设计优势

CS5366是ASL集睿致远推出的2LAN带PD&#xff08;最高100W&#xff09;可拉U3口的高集成度芯片&#xff0c;分辨率支持4K60HZ。在刷新率上&#xff0c;CS5366作为升级一代&#xff0c;超越了CS5266达到60HZ&#xff0c;同时在各个方面做到了优越性&#xff0c;极具性价比的一代&…

导出功能exportExcel (现成直接用)

1. 实体类字段上加 Excel(name "xxx"), 表示要导出的字段 Excel(name "订单号")private String orderNo; 2. controller (get请求) /*** 导出订单列表*/ApiOperation("导出订单列表")GetMapping("/export")public void export(HttpS…

开源代码扫描工具 Socket新增对 Go 生态系统的支持

导读继日前宣布完成 2000 万美元的 A 轮融资后&#xff0c;开源代码扫描工具 Socket 紧接着宣布新增了对 Go 语言的支持&#xff1b;此前其仅支持 JavaScript 和 Python 语言。 “在过去的几个月中&#xff0c;我们观察到针对 Golang 的供应链攻击有所增加。意识到这种迫在眉睫…

Git工作流

实际开发项目使用到的分支: main&#xff1a;生产环境&#xff0c;也就是你们在网上可以下载到的版本&#xff0c;是经过了很多轮测试得到的稳定版本。 release&#xff1a; 开发内部发版&#xff0c;也就是测试环境。 dev&#xff1a;所有的feature都要从dev上checkout。 fea…

.netcore发布独立版部署

.NetCore 在发布独立版时会打包独立环境&#xff0c;就算服务没有安装环境也能运行&#xff0c;这就是.NetCore跨平台的特性之一。 按照微软的传统配套&#xff0c;c#开发的项目一般都是发布打包程序部署在iis&#xff0c;但是.netcore 跨平台的&#xff0c;就是说当发布独立版…

【BASH】回顾与知识点梳理(三十九)

【BASH】回顾与知识点梳理 三十九 三十九. make、tarball、函数库及软件校验39.1 用 make 进行宏编译为什么要用 makemakefile 的基本语法与变量 39.2 Tarball 的管理与建议使用原始码管理软件所需要的基础软件Tarball 安装的基本步骤一般 Tarball 软件安装的建议事项 (如何移除…

基于AVR128单片机智能传送装置

一、系统方案 1、板载可变电阻&#xff08;电位器&#xff09;R29的电压作为处理器ATmega128的模数转换模块中单端ADC0的模拟信号输入&#xff08;跳线JP13短接&#xff09;。 2、调节电位器&#xff0c;将改变AD转换接口ADC0的模拟信号输入&#xff0c;由处理器完成ADC0的A/D转…

Android studio 2022.3.1 鼠标移动时不显示快速文档

在使用技术工具的过程中&#xff0c;我们时常会遇到各种各样的问题和挑战。最近&#xff0c;我升级了我的Android Studio到2022.3.1版本&#xff0c;但是在使用过程中&#xff0c;我碰到了一个让我颇为困扰的问题&#xff1a;在鼠标移动到类名或字段上时&#xff0c;原本应该显…

Visual Studio2022史诗级更新,增加多个提高生产力的功能

Visual Studio 2022发布了17.7x版&#xff0c;这次更新中&#xff0c;增加多个提高生产力的功能以及性能进一步改进。 如果要体验新功能&#xff0c;需要将Visual Studio 2022的版本升级到17.7及以上 下面我们看看新增的功能以及改进的功能&#xff01; 目录 文件比较自动修复代…

新仿百度文库网站源码 免费文库网站源码 文档分享平台源码 实现文档上传下载及在线预览

仿百度文库是一个以PHPMySQL进行开发的免费文库网站源码。主要特点如下&#xff1a; 界面仿照百度文库&#xff0c;使用户在使用时更加熟悉和舒适。支持文档的上传、下载和在线预览功能&#xff0c;方便用户分享和获取各种文档资料。用户可以对自己需要的文档进行悬赏&#xf…

[MyBatis系列③]动态SQL

目录 1、简介 2、if标签 3、foreach标签 4、SQL抽取 ⭐MyBatis系列①&#xff1a;增删改查 ⭐MyBatis系列②&#xff1a;两种Dao开发方式 1、简介 开发中在MyBatis映射文件配置SQL语句&#xff0c;但是前面配置的都是比较简单的&#xff0c;不涉及稍复杂的业务场景。想要应…

服务器数据恢复-AIX PV完整镜像方法以及误删LV的数据恢复方案

AIX中的PV相当于物理磁盘&#xff08;针对于存储来说&#xff0c;PV相当于存储映射过来的卷&#xff1b;针对操作系统来说&#xff0c;PV相当于物理硬盘&#xff09;&#xff0c;若干个PV组成一个VG&#xff0c;AIX可以将容量不同的存储空间组合起来统一分配。AIX把同一个VG的所…