面试算法89:房屋偷盗

题目

输入一个数组表示某条街道上的一排房屋内财产的数量。如果这条街道上相邻的两幢房屋被盗就会自动触发报警系统。请计算小偷在这条街道上最多能偷取到多少财产。例如,街道上5幢房屋内的财产用数组[2,3,4,5,3]表示,如果小偷到下标为0、2和4的房屋内盗窃,那么他能偷取到价值为9的财物,这是他在不触发报警系统的情况下能偷取到的最多的财物
在这里插入图片描述

分析

小偷在标号为i的房屋前有两个选择。一个选择是他进去偷东西。由于街道上有报警系统,因此他不能进入相邻的标号为i-1的房屋内偷东西,之前他最多能偷取的财物的最大值是f(i-2)。因此,小偷如果进入标号为i的房屋并盗窃,他最多能偷得f(i-2)+nums[i](nums是表示房屋内财物数量的数组)。另一个选择是小偷不进入标号为i的房屋,那么他可以进入标号为i-1的房屋内偷东西,因此此时他最多能偷取的财物的数量为f(i-1)。那么小偷在到达标号为i的房屋时他能偷取的财物的最大值就是两个选项的最大值,即f(i)=max(f(i-2)+nums[i],f(i-1)),这就是解决这个问题的状态转移方程。
上述状态转移方程有一个隐含条件,假设i大于或等于2。当i等于0时,f(0)是街道上只有标号为0的一幢房屋时小偷最多能偷得的财物的数量,此时他无所顾忌,直接进入标号为0的房屋偷东西,因此f(1)=nums[0];当i等于1时,f(1)是街道上只有标号为0和1的两幢房屋时小偷最多能偷得的财物的数量,因为街道上有报警系统,他只能到两幢房屋的其中一幢去偷东西,所以他应该选择到财物数量更多的房屋去偷东西,即f(1)=max(nums[0],nums[1])。

解: 带缓存的递归代码

public class Test {
    public static void main(String[] args) {
        int[] cost = {2, 3, 4, 5, 3};
        int result = rob(cost);
        System.out.println(result);

    }

    public static int rob(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }

        int[] dp = new int[nums.length];
        Arrays.fill(dp, -1);

        helper(nums, nums.length - 1, dp);
        return dp[nums.length - 1];
    }

    private static void helper(int[] nums, int i, int[] dp) {
        if (i == 0) {
            dp[i] = nums[0];
        }
        else if (i == 1) {
            dp[i] = Math.max(nums[0], nums[1]);
        }
        else if (dp[i] < 0) {
            helper(nums, i - 2, dp);// 为什么传i-2,因为最后知道需要dp[i-2]的值
            helper(nums, i - 1, dp);// 为什么传i-1,因为最后知道需要dp[i-1]的值
            dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
        }
    }
}

分析2:空间复杂度为O(n)的迭代代码

也可以换一种思路,即先求出f(0)和f(1)的值,然后用f(0)和f(1)的值求出f(2),用f(1)和f(2)的值求出f(3),以此类推,直至求出f(n-1)。这种自下而上的思路通常可以用一个for循环实现

public class Test {
    public static void main(String[] args) {
        int[] cost = {2, 3, 4, 5, 3};
        int result = rob(cost);
        System.out.println(result);

    }

    public static int rob(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }

        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        if (nums.length > 1) {
            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];
    }
}

分析3:空间复杂度为O(1)的迭代代码

如果仔细观察上述代码,就能发现计算“dp[i]”时只需要用到“dp[i-1]”和“dp[i-2]”这两个值,也就是说,只需要缓存两个值就足够了,并不需要一个长度为n的数组,因此,可以进一步优化代码的空间效率。

public class Test {
    public static void main(String[] args) {
        int[] cost = {2, 3, 4, 5, 3};
        int result = rob(cost);
        System.out.println(result);

    }

    public static int rob(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }

        int[] dp = new int[2];
        dp[0] = nums[0];

        if (nums.length > 1) {
            dp[1] = Math.max(nums[0], nums[1]);
        }

        for (int i = 2; i < nums.length; i++) {
            dp[i % 2] = Math.max(dp[(i - 1) % 2], dp[(i - 2) % 2] + nums[i]);
        }

        return dp[(nums.length - 1) % 2];
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Aspect Sentiment Quad Prediction as Paraphrase Generation》论文阅读

文章目录 文章介绍文章模型问题定义文章模型PARAPHRASE建模 文章地址&#xff1a; https://arxiv.org/abs/2110.00796 文章介绍 这篇文章在已有的方面级情感分析任务的基础了研究了一项新的任务&#xff1a;方面级情感四元组提取&#xff08;Aspect Sentiment Quad Prediction…

【mujoco】Ubuntu20.04中解决mujoco报错raise error.MujocoDependencyError

【mujoco】Ubuntu20.04中解决mujoco报错raise error.MujocoDependencyError 文章目录 【mujoco】Ubuntu20.04中解决mujoco报错raise error.MujocoDependencyError1. 报错的具体情况2. 解决过程3. 其他问题3.1 ModuleNotFoundError: No module named OpenGL3.2 ModuleNotFoundEr…

期末考试成绩一键私发

期末考试即将开始&#xff0c;学生们心心念念的当然是成绩啦&#xff01;老师们发布期末考试成绩的方式也是多种多样&#xff0c;趣味横生。 有的老师会选择传统的纸质方式。精心整理每个学生的成绩&#xff0c;然后用红笔亲自在成绩单上写下每个学生的分数。这种方式虽然古老…

鸿蒙OS:不止手机,是物联网应用开发

鸿蒙开发是华为自主研发的面向全场景的分布式操作系统&#xff0c;旨在将生活场景中各类终端进行整合&#xff0c;实现不同终端设备间的快速连接、资源共享、匹配合适设备、提供流畅的全场景体验。 鸿蒙开发具有以下特点&#xff1a; 面向全场景&#xff1a;鸿蒙系统能够覆盖…

基于web的电影院购票系统

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1选题动因 当前…

短期爆发or未来趋势?浅谈音视频小程序在教育行业的应用发展

疫情三年&#xff0c;极大改变了人类的生活方式&#xff0c;尤其是一些线下化程度占比很大的行业&#xff0c;被迫进行信息化甚至数字化的转型。 教育场景数字化逐步成为刚需 经历过了2018年以来的&#xff0c;国家对在线教育行业的监管收紧&#xff0c;以及受益于 5G 技术的发…

新闻稿发布:媒体重要还是价格重要

在当今信息爆炸的数字时代&#xff0c;企业推广与品牌塑造不可或缺的一环就是新闻稿发布。新闻稿是一种通过媒体渠道传递企业信息、宣传品牌、事件或产品新闻的文本形式。发布新闻稿的过程旨在将企业的声音传递给更广泛的受众&#xff0c;借助媒体平台实现品牌故事的广泛传播。…

Spring Cloud Config相关面试题及答案(2024)

1、什么是 Spring Cloud Config&#xff0c;它解决了哪些问题&#xff1f; Spring Cloud Config 是一个为微服务架构提供集中化外部配置支持的项目。它是构建在 Spring Cloud 生态系统之上&#xff0c;利用 Spring Boot 的开发便利性&#xff0c;简化了分布式系统中的配置管理…

Linux驱动开发笔记(六):用户层与内核层进行数据传递的原理和Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/135384355 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

互联网加竞赛 基于RSSI的室内wifi定位系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; wifi室内定位系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;…

list1.Sort((m, n) => m.Id - n.Id); id是double类型的为什么回报错

问题产生的地方 原因 对于 double 类型的属性&#xff0c;不能直接使用减法运算符进行比较。减法运算符只能用于数值类型&#xff0c;而 double 是浮点数类型。 要在 double 属性上进行排序&#xff0c;可以使用 CompareTo 方法或者使用自定义的比较器。 更改 要在 double 属性…

iOS UITextField复制、粘贴框显示为英文如何解决

问题描述&#xff1a; 使用UITextField&#xff0c;欲粘贴文本&#xff0c;长按或者双击展示的提示框显示为英文 解决方案&#xff1a; 在Xcode配置文件info,plist文件中&#xff0c;新增Localizas属性&#xff0c;填入Chinese 结果如下&#xff1a; 提示框成功展示为中文

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -后端架构搭建

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

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

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

基于Java SSM框架实现固定资产管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现固定资产管理系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&a…

【科研绘图】手把手教你Origin安装以及汉化,附带网盘链接

Origin安装 1.下载文件压缩包2.&#xff08;软件安装部分&#xff09;解压&#xff0c;以管理员身份运行&#xff0c;.exe&#xff0c;下一步3. &#xff08;软件设置部分&#xff09;打开软件无需更改&#xff0c;点OK4. &#xff08;破解部分&#xff09;&#xff0c;找到刚才…

基于gitlab 12.8.0版本的完整镜像过程

目前已在一台服务器上安装了gitlab 12.8.0&#xff0c;并且稳定运行了有几年了&#xff0c;其上面也创建了大量的项目。目前要求对该gitlab及其上面的所有仓库做一个完整的镜像。具体操作过程如下&#xff1a; 1、确认现有的gitlab的版本号 2、到gitlab官网下载相同版本号的gi…

生活中危险的气体:一氧化碳与二氧化碳中毒的症状及安全预防措施

一氧化碳和血红蛋白亲和力超过氧气&#xff0c;会占用血红蛋白&#xff0c;导致缺氧。 二氧化碳会和血浆结合&#xff0c;导致血液pH值不正常&#xff0c;抑制呼吸&#xff0c;导致窒息。 通俗点说&#xff1a;一氧化碳是中毒&#xff0c;二氧化碳则是窒息。 一氧化碳中毒 …

d3dcompiler_43.dll丢失怎么修复?怎么解决

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到d3dcompiler_43.dll文件”。那么&#xff0c;d3dcompiler_43.dll是什么文件&#xff1f;它的作用是什么&#xff1f;如果缺失了该如何修复呢&#xff1f;本文将详细介绍d3dcompiler_…

一款神仙级SpringCloud微服务开源项目,接私活吊到不行!(附源码)

今天给大家推荐一个牛逼的接私活项目&#xff0c;SpringCloud微服务架构项目&#xff01; 一个由商业级项目升级优化而来的微服务架构&#xff0c;采用SpringBoot 2.7 、SpringCloud 等核心技术构建&#xff0c;提供基于React和Vue的两个前端框架用于快速搭建企业级的SaaS多租…