打家劫舍问题

news2024/11/16 13:55:05

题目:

打家劫舍https://leetcode.cn/problems/house-robber/

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

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

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

代码:

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

思路:

这是一个典型的dp问题,设f[i]是偷盗前i个房屋可以获得的最高金额。

当房间数大于2时,可以将前i个房屋能获得的最大金额分为两种情况。

(1)偷第i个房间,则由题意知道,此时就不能偷第i-1个房间。因为f[i-2]等于偷前i-2个房间可以偷到的最大金额,所以此时偷前i个房间可以获得的最大金额等于偷前i-2个房间能偷到的最大金额加上第i个房间的金额,即f[i]=f[i-2]+nums[i];

(2)不偷第i个房间,此时可以偷第i-1个房间,偷前i个房间能获得的最大金额就相当于偷前i-1个房间可以获得的最大金额,即f[i]=f[i-1];

综合两种情况,取两种情况的最大值,即为偷前i个房间可以获得的最大金额,即:

f[i]=max(f[i-2]+nums[i],f[i-1]);

所以状态转移方程:

最后结果为f[n-1],n为房屋总个数。 

题目

打家劫舍 IIhttps://leetcode.cn/problems/house-robber-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 n=nums.length;
        if(n<2){
            return maxRob(nums);
        }
        return Math.max(maxRob(Arrays.copyOfRange(nums,0,n-1)),maxRob(Arrays.copyOfRange(nums,1,n)));
    }
    int maxRob(int[] nums){
        int n=nums.length;
        if(n>=2) nums[1]=Math.max(nums[0],nums[1]);
        for(int i=2;i<n;i++){
            nums[i]=Math.max(nums[i-2]+nums[i],nums[i-1]);
        }
        return nums[n-1];
    }
}

思路:

这个题和上面一个题的思路差不多,只不过因为这个是环形房屋,所以可以将环形房屋拆分成线形房屋,分为两种情况讨论。

这个题和上个不一样的地方在于第一个房屋和最后一个房屋不能同时偷盗,所以分为以下两种情况讨论(设有n个房屋):

(1)偷盗第一个房屋,此时不能偷盗最后一个房屋,所以此时能获得的最大金额为偷盗第1个房屋到第n-1个房屋的最大金额。

(2)偷盗最后一个房屋,此时不能偷盗第一个房屋,所以此时能获得的最大金额为偷盗第2个房屋到第n个房屋的最大金额。

按上个题的思路算出两种情况下获得的最大金额,然后取两种情况的最大值即可。

要注意的一点是当只有一个房屋的时候,直接返回该房屋的金额即可。

题目

打家劫舍 IIIhttps://leetcode.cn/problems/house-robber-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

 代码:

class Solution {
    public int rob(TreeNode root) {
        int[] res=dfs(root);
        return Math.max(res[0],res[1]);
    }
    int[] dfs(TreeNode node){
        if(node==null){
            return new int[]{0,0};
        }
        int[] l=dfs(node.left);
        int[] r=dfs(node.right);
        int[] res=new int[2];
        res[0]=Math.max(l[0],l[1])+Math.max(r[0],r[1]);
        res[1]=l[0]+r[0]+node.val;
        return res;
    }
}

思路:

这个题可以设置一个数组,num[0]记录不偷当前节点的房屋能获得的最大金额,num[1]记录偷当前节点能获得的最大金额。记录当前节点左节点为left,右节点为right,对两种情况进行讨论。

(1)当不偷当前房屋的时候,左子节点可以偷盗也可以不偷盗,即从左子节点上的房屋能获得的最大金额为max(left[0],left[1])。同理,右子节点房屋也可以偷盗可以不偷,右子节点房屋能获得的最大金额为max(right[0],right[1])。即num[0]=max(left[0],left[1])+max(right[0],right[1])。

(2)当偷盗当前房屋,左右子节点都不能偷盗,从左右子节点能获得的最大金额分别为left[0]和right[0],再加上当前节点能获得的金额,即为偷盗当前房屋能获得的最大金额。即num[1]=left[0]+right[0]+node.val。

最后计算到根节点,所有房屋能获得的最大金额为max(root[0],root[1])。

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

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

相关文章

重写Properties类,实现对properties文件的有序读写,数据追加,解决中文乱码

前言 *.properties文件&#xff0c;是 Java 支持的一种配置文件类型&#xff0c;并且 Java 提供了 properties 类来读取 properties 文件中的信息。文件中以键值对 "键值"的形式&#xff0c;存储工程中会多次重复使用的配置信息&#xff0c;通过“Properties”类来读…

【Mysql实战】使用存储过程和计算同比环比

背景 同环比&#xff0c;是基本的数据分析方法。在各类调研表中屡见不鲜&#xff0c;如果人工向前追溯统计数据&#xff0c;可想而知工作量是非常大的。 标题复制10行&#xff0c;并且每行大于10个字符【源码解析】SpringBoot接口参数【Mysql实战】使用存储过程和计算同比环比…

超全总结:硬件设计基础60条

硬件是一个非常复杂的系统&#xff0c;在设计过程中都会遇到或多或少的问题&#xff0c;本文中总结了非常基础的60个问题&#xff0c;供大家参考。 1、请说明一下滤波磁珠和滤波电感的区别。 磁珠由导线穿过铁氧体组成&#xff0c;直流电阻很小&#xff0c;在低频时阻抗也很小…

数字化转型,目的是为了转型还是数字化?

受第四次工业革命浪潮的影响&#xff0c;传统工业经济社会快速向数字经济转型过渡&#xff0c;企业创新面临的经济环境发生根本性变革。数字技术广泛应用于生产、交换、消费等经济环节&#xff0c;为企业产品创新、服务创新以及数字化开放式创新提供了动力源泉。数字经济背景下…

如何利用生产管理系统提高粉末治金工业的生产调度能力

在粉末冶金工业中&#xff0c;生产管理系统的应用已经成为了一个必不可少的部分。生产管理系统可以帮助企业实现自动化、信息化、智能化的生产&#xff0c;提高生产效率、降低生产成本、提高产品质量。生产管理系统可以对生产流程进行全面的监控和管理&#xff0c;从而实现生产…

11个超好用的SVG编辑工具

SVG的优势在于SVG图像可以更加灵活&#xff0c;自由收缩放大而不影响图片的质量&#xff0c;一个合适的SVG编辑工具能够让你的设计事半功倍&#xff0c;下面就一起来看看这些冷门软件好用在哪里。这11个超好用的SVG编辑工具依次为&#xff1a;即时设计、Justinmind、Sketsa SVG…

Sentinel-Dashboard-1.8持久化Nacos

Sentinel-Dashboard-1.8持久化Nacos 目录 Sentinel-Dashboard-1.8持久化Nacos一、客户端改造1.引入pom.xml文件依赖2.配置application.yml文件。 二、Sentinel-Dashboard源码改造三、测试 一、客户端改造 1.引入pom.xml文件依赖 <!-- https://mvnrepository.com/artifact/…

这些神奇的AI智能机器人很早就已出现过,你确定你不了解?

很多人自从ChatGPT出现以后&#xff0c;就总是担忧&#xff0c;担心自己的职业被影响&#xff0c;然后很多人大肆宣扬 ChatGPT 真是了不得&#xff0c;未来再辅助机器人&#xff0c;加上大数据&#xff0c;一定可以怎么怎么样&#xff0c;说的神乎其神&#xff0c;说实话&#…

几个pdf怎么合并在一起?

几个pdf怎么合并在一起&#xff1f;在日常生活和工作中&#xff0c;我们可能会遇到需要将多个PDF文件合并为一个文件的问题。在对PDF文件合并之后&#xff0c;能够更好地组织和管理信息。将pdf文件合并能够在很大程度上提高工作效率&#xff0c;减少查找和打开不同文件的时间。…

【计算机视觉 | ViT-G】谷歌大脑提出 ViT-G:缩放视觉 Transformer,高达 90.45% 准确率

文章目录 一、简介二、如何做到的&#xff1f;三、扩展数据四、「head」 的解耦权重衰减五、通过移除 [class] token 节省内存六、实验结果6.1 将计算、模型和数据一起扩展6.2 ViT-G/14 结果 论文地址为&#xff1a; https://arxiv.org/pdf/2106.04560.pdf一、简介 视觉 Trans…

PoseiSwap合规、隐私与支持更广泛的资产

Nautilus Chain 代表了公链赛道发展的一个新的范式形态&#xff0c;作为目前行业内首个 Layer3 链&#xff0c;是目前行业内第一个并行化且运行速度最快的EVM Rollup 方案。作为首个模块化链&#xff0c;存储、计算、共识等都在不同的模块中&#xff0c;意味着其能够获得更高的…

如何建立DDR3测试工程

要建立DDR3的测试工程&#xff0c;首先要生成mig IP核&#xff0c;然后写测试模块使用这个IP核进行测试。 一、生成 mig IP核 建立一个新工程&#xff0c;然后生成 mig IP核。 关键步骤如下&#xff1a; &#xff08;1&#xff09;点击 IP catalog&#xff0c;在搜索框输入…

SSM框架学习-AOP通知类型

在AOP中&#xff0c;通知&#xff08;Advice&#xff09;是对切点进行操作的方法&#xff0c;用于实现切面定义的具体逻辑。Spring框架支持五种类型的通知&#xff1a; 1. 前置通知&#xff08;Before advice&#xff09; 在连接点执行前&#xff0c;执行通知 Before("**…

【跟着陈七一起学C语言】今天总结:C语言的结构体和其它数据形式

友情链接&#xff1a;专栏地址 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的错误&#x…

OpenGL高级-立方体贴图

运行效果 源代码 着色器 渲染物体的顶点着色器&#xff1a; #version 330 core // 传入局部坐标下的顶点坐标 layout( location 0 ) in vec3 position; layout (location 1) in vec2 texCoords;// 传入变换矩阵 uniform mat4 model; uniform mat4 view; uniform mat4 proje…

d2l的一些理论知识的整理【1】

目录 考试知识整理引言2 预备知识2.1. 数据操作2.2. 数据预处理2.3. 线性代数2.4. 微积分2.5. 自动微分2.6. 概率2.7. 查阅文档 3 线性神经网络3.1. 线性回归3.2. 线性回归的从零开始实现3.3. 线性回归的简洁实现3.4. softmax回归3.5. 图像分类数据集3.6. softmax回归的从零开始…

AT24C16页写和多页写

AT24C16 2K字节(存储内存) 128&#xff08;页面数&#xff09;* 16 &#xff08;每页的字节数&#xff09; 2^11 (寻址地址位数 11位)。 AT24C16有128(2^7128)页只需要7位地址&#xff0c;分为高3位和低4位&#xff0c;高3位在设备地址中&#xff0c;低4位在字地址中。 设备…

Flutter GetX Tag 属性使用详解

Flutter GetX Tag 属性使用详解 了解 Flutter GetX Tag 属性的定义、用途、实现方式和常见问题。 前言 Flutter中&#xff0c;GetX是一款非常流行的状态管理库。它不仅提供了状态管理的功能&#xff0c;还有路由、依赖注入和许多其他功能。在这篇文章中&#xff0c;我将介绍如…

Node.js简易教程

目录 介绍 fs模块 演示 writeFile 异步写入 appendFile/appendFileSync 追加写入 createWriteStream流式写入 readFile异步读取文件/readFileSync同步读取文件 createReadStream流式读取 文件移动与重命名 文件删除 http模块 创建服务 url 格式化 获取静态文件服务 node模…

“卷爆了“的IT互联网行业,为啥至今还有人头铁往里冲?

细数互联网过往的发展史&#xff0c;造就了成千上万的企业家、创业者&#xff0c;众多职场人趋之若鹜地选择互联网行业&#xff0c;想从这个领域捞一桶金。 但不知道从什么时候开始&#xff0c;一篇篇关于互联网红利消失&#xff0c;流量枯竭的文章接踵而至&#xff0c;现在转…