198.打家劫舍,213.打家劫舍II ,337.打家劫舍III

news2024/11/18 11:39:48

198. 打家劫舍

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

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

示例 1:

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

示例 2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
     偷窃到的最高金额 = 2 + 9 + 1 = 12 。

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 400

 

设 dp[i] 为 1 ~ i +1 号房屋(下标对应为 0 ~ i)最多可以偷窃的金额,dp[i] 的值取决于下标为 i 的房屋偷还是不偷。如果偷,下标为 i - 1 的房屋显然不能偷了,dp[i] = dp[i - 2] + nums[i] 。如果不偷,dp[i] = dp[i - 1] 。

class Solution {
    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(dp[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];
    }
}

213. 打家劫舍 II

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

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

示例 1:

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

示例 2:

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

示例 3:

输入:nums = [1,2,3]
输出:3

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 1000

 

本题可以把环拆成线性情况,保证开头结尾不都偷就行了。可以分成两种情况,一种是第一个房屋绝对不偷,最后一个房屋可偷可不偷。一种是最后一个房屋绝对不偷,第一个房屋可偷可不偷。然后就变成和上面那道打家劫舍一样的情况了,两种情况求出来取最大值。

class Solution {
    public int rob(int[] nums) {
        int len = nums.length;
        if (len == 1)   return nums[0];
        return Math.max(robAction(nums, 0, len - 1), robAction(nums, 1, len));
    }
    int robAction(int[] nums, int start, int end) {
        if (start == end - 1)   return nums[start];
        int[] dp = new int[nums.length];
        dp[start] = nums[start];
        dp[start + 1] = Math.max(dp[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 - 1];
    }
}

337. 打家劫舍 III

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

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

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

示例 1:

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

示例 2:

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

提示:

  • 树的节点数在 [1, 104] 范围内
  • 0 <= Node.val <= 104

 

本题的关键是想到怎么定义dp数组。答案是设置一个长度为2的dp数组,下标 0 记录不偷该节点所得到的最高金额,下标 1 记录偷该节点所得到的最高金额,从下往上遍历(后序遍历)更新dp数组。递归的终止条件显然是遍历到空节点,对应dp数组是[0, 0]。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int rob(TreeNode root) {
        int[] dp = robAction(root);
        return Math.max(dp[0], dp[1]);
    }
    int[] robAction(TreeNode root) {
        int[] dp = new int[2];
        if(root == null)    return dp;
        int[] left = robAction(root.left);
        int[] right = robAction(root.right);
        // 不偷该节点,最大金额为左孩子最大金额和右孩子最大金额之和
        dp[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
        // 偷该节点,显然左右孩子都不偷,最大金额为当前节点金额加上左右孩子不偷最大金额
        dp[1] = root.val + left[0] + right[0];
        return dp;
    }
}

 

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

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

相关文章

项目管理中的WBS

项目管理中的WBS(工作分解结构) 在项目管理中&#xff0c;我们必然会用到一个工具WBS(工作分解结构)&#xff0c;在PMP的课程中&#xff0c;也作为了一个重要的考察对象。 一. WBS的定义 工作分解结构&#xff08;Work Breakdown Structure&#xff09;&#xff1a;以可交付成…

什么是网络分析仪噪声参数?

噪声参数在被测器件的输入端口和测试仪器内置噪声接收机的输入端口上都会产生影响。要想了解为什么噪声参数会给测量结果带来误差&#xff0c;我们首先需要了解什么是噪声参数。放大器的噪声参数描述了噪声系数随着源阻抗Γs而变化的情况。在史密斯圆图上&#xff0c;噪声参数通…

长盈通在科创板上市:研发费用率低于行业均值,皮亚斌为实控人

12月12日&#xff0c;武汉长盈通光电技术股份有限公司&#xff08;下称“长盈通”&#xff0c;SH:688143&#xff09;在上海证券交易所科创板上市。本次上市&#xff0c;长盈通的发行价为35.67元/股&#xff0c;发行市盈率48.61倍&#xff0c;而该公司所属行业最近一个月静态平…

QTabBar进阶用法:修改标题宽度,使标题宽度自适应窗体宽度,close图标大小设置,close图标修改,文字对齐方式修改

这是一个没有处理过的QTabWidget, 在功能上已经满足使用了&#xff0c;但是有时会有一些外观上特殊的需求&#xff0c;需要对它进行修改。 1. 更改标签的长度。 可以用样式表改&#xff1a; setStyleSheet("QTabBar::tab{height:50;width:200}");"QTabBar::t…

GitLab安装与卸载

一、安装Postfix以发送通知邮件 安装命令&#xff1a;sudo yum install postfix 将postfix服务设置成开机自启动&#xff0c;安装命令&#xff1a;sudo systemctl enable postfix 启动postfix&#xff0c;安装命令&#xff1a;sudo systemctl start postfix 二、安装gitlab …

【数据结构】栈定义及其常用的基本操作(C/C++)

目录 ●图示&#xff08;以顺序栈为例&#xff09; ●栈的类型定义 ●栈常用的基本操作 ●顺序栈 ●链式栈 ●简单案例 1.顺序栈&#xff08;这里只实现用顺序表存储3个学生的学号、姓名、年龄并且将其输出查看。若进行其他操作&#xff0c;对代码进行简单修改即可&…

Read IDS scan文件

IDS 雷达的文件格式比原来的。dt格式文件复杂&#xff0c;由于数据来自检测单位&#xff0c;对文件的理解并不到位。 采集的数据如下&#xff1a; 产生的文件很多&#xff0c;比如这次有2个采集 Data内部的文件 很多文件并没有理解到 3 文件说明 3.1 pos 结尾是 但距离与最后…

Mysql高频面试题(二)

文章目录1. 平衡二叉树、红黑树、Hash结构、B树和B树的区别是什么&#xff1f;2. 一个B树中大概能存放多少条索引记录&#xff1f;3. 使用B树存储的索引crud执行效率如何&#xff1f;4. 什么是自适应哈希索引&#xff1f;5. 什么是2-3树 2-3-4树&#xff1f;6. 为什么官方建议使…

边界安全防护方案

汽车制造业 MES系统 DNC系统 生产 安全域1 管理层 工控安全隔离装置 交换机 安全配置核查系统 HMI 历史数据库 运行监控系统 实时数据库 打印机 过程 安全域2 监控层 工控漏洞扫描系统 安全交换机 工控安全审计系统 工控入侵检测系统工程师站 A 操作员站 A 实时数据库A 操作员…

测试员做外包能转正吗?外包员工能变正式员工吗?

外包员工能变正式员工吗&#xff1f;这里辟谣一波&#xff0c;许多外包都说有转正机会。实际情况是几乎等于零。其中&#xff0c;三方外包更是可以直接和零划等号。三方外包的转正&#xff0c;往往就是给个内推机会&#xff0c;然后和面试官会熟悉一些。 然而这些都没什么价值…

简述基于JavaEE企业级开发技术(Spring)

一、绪论 1、学习内容 javaEE企业开发技术概述javaEE容器——SpringORM数据层——MyBatis/JPAWeb层——Spring MVC展现层——JSP/Thymeleaf整合框架——SSM/SSH用户模块分析用户模块功能模块设计 前端框架&#xff1a;Bootstrap&#xff0c;NodeJS&#xff0c;Vue/React/Ang…

聊一聊世界杯的半自动越位技术

一、前言 11 月 22 日&#xff0c;在卡塔尔卢赛尔球场进行的 2022 卡塔尔世界杯足球赛 C 组比赛中&#xff0c;阿根廷队以 1 比 2 不敌沙特阿拉伯队&#xff0c;我相信哥很多人都不敢相信&#xff0c;阿根廷居然又输了&#xff0c;而沙特取得亚洲球队在本届世界杯的首场胜利。…

【Pytorch】第 9 章 :Capstone 项目——用 DQN 玩 Flappy Bird

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

一文了解瀑布式项目管理和敏捷项目管理的区别!

众所周知&#xff0c;项目管理起源于软件开发行业&#xff0c;而目前已广泛应用于各行各业&#xff0c;完整的项目管理包含五个部分&#xff0c;分别是&#xff1a;项目启动、项目规划、项目执行、项目监控、项目收尾。随着行业的发展&#xff0c;传统的瀑布式项目管理模式&…

海外跨境电商5大关键趋势,Starday带你先发制人

受新冠疫情的影响&#xff0c;海外市场需求总体而言有所下降&#xff0c;然而随着我国跨境出口产品向更大出口量级、更多出口品类以及更高客单价的趋势发展&#xff0c;跨境出口电商行业却有着快速发展&#xff0c;基于主流跨境电商平台相关数据和中国卖家调研&#xff0c;报告…

卓越工程之单元测试在行权鉴权中的实践

前言 在去年的时候就读过《重构&#xff1a;改善既有代码的设计》这本在代码重构领域里的经典&#xff0c;当时在读的时候就苦于有这么两点导致只停留在了“读”上面&#xff0c;而缺少实践。 1.全书内容比较枯燥乏味&#xff0c;虽然有部分代码示例&#xff0c;但是语言并不…

新能源车的火烧到了二手车市场

今年以来&#xff0c;新能源二手车市场有明显回暖的迹象。据中国汽车流通协会数据显示&#xff0c;今年上半年&#xff0c;新能源二手车交易量达15.6万辆&#xff0c;同比增长36.4&#xff05;&#xff0c;比传统燃油车增速高出24.5个百分点。另据瓜子二手车大数据显示&#xf…

Android平台GB28181设备接入端预置位查询(PresetQuery)探讨和技术实现

之前blog介绍了GB28181云台控制&#xff08;PTZCmd&#xff09;相关&#xff0c;本文主要是介绍下GB28181预置位查询。 预置位这块&#xff0c;在处理带云台的设备非常必要&#xff0c;我们主要是做Android平台的GB28181的设备接入端&#xff0c;也可以转发RTSP摄像头接入到国…

F3--FPGA读写EEPROM实例2022-12-12

1.EEPROM简介 EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。在嵌入式控制系统中常常用来保存设备初始化所需数据。发展过程&#xff1a;ROM – > PROM –> EPROM –> EEPROM&…

移动Web基础知识点大全

移动Web基础知识点大全移动Web1、字体图标2、平面转换3、渐变4、空间转换5、动画6、移动端特点7、百分比布局8、Flex布局9、移动适配9.1 rem9.2 less9.3 vw/vh10、媒体查询11、BootStrap移动Web 1、字体图标 目标&#xff1a;使用字体图标实现网页中简洁的图标效果字体图标 字…