面试热题(打家窃舍)
一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响小偷偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组
nums,请计算 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。输入:nums = [1,2,3,1] 输出:4 解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。

如上图,每个房间放的金子都不同,有多有少,两个房间之间有警报相连,如果同时偷取相连的两个房子,警报就会发出,你就要去蹲局子,那么如何做一个聪明的小偷,在不触发警报的情况下偷取的金额是最大的,接下来,让我们替小偷想一个方案,如何去偷?
我们可以从后往前考虑,假如我们偷取最后一间房间

我们是不是不可以偷取倒数第二间房间,可供的选择就是在倒数第二间之后随便选一家进行偷取

为了利益最大化,我们是不是应该偷取的是前n-2间房子的最大金额数+最后一间房子的最大金额数就是我们当前可以偷取的最大金额数呢?NONONO,我们还有一种不偷取最后一间房子的情况,偷取n-2房间的情况

我们通过上述的推导就可以将动态转移方程写出来
dp[i]=Math.max(dp[i-1],nums[i]+dp[i-2]);
我们设置的dp数组的语意是dp[i]是,偷取第i家的最大金额数
我们可以很简单的推导出基本情况,如果没有房间,小偷就得被饿死,如果只有一家,小偷无可奈何,只能被迫的去偷这家,如果有两家,小偷肯定回去偷金额比较多的那家
dp[0]=nums[0];dp[1]=Math.max(nums[0],nums[1]);
解题的入参判断肯定少不了,这种入参判断能为你解决不少的麻烦
if(n==0){return 0;}if(n==1){return nums[0];}
那么我们的代码 就已经写完了
public int rob(int[] nums) {int n=nums.length;if(n==0){return 0;}if(n==1){return nums[0];}int [] dp=new int[n];dp[0]=nums[0];dp[1]=Math.max(nums[0],nums[1]);for(int i=2;i<n;i++){dp[i]=Math.max(dp[i-1],nums[i]+dp[i-2]);}return dp[n-1];}
打家劫舍II的基本过程和I差不多,就是从一个直线型房屋排列转换为环形房屋排列,这种就应该考虑是n-1房子和0房子偷不偷的问题,其实可以分为两个数组,分别计算可以偷取的最大金额,最后取最大值就ok了,我们下面讲打家窃舍III
我不得不说,这小偷的数据结构学的其实蛮好的,什么样的房屋排列都能让他想到数据结构这块,利用算法的知识进行解决,不当码农可惜了![]()
来让我们言归正传

对于我们的选择是每个节点是否偷取决定着我们最后的结果

如果偷的话,情况又是如何?不偷的时候情况又是怎样的?


看到这幅图大家会想到什么?树的层序遍历,但是树的层序遍历在这里可是不适用的,因为这道题中的有些情况是通过不了,所以我们换种思维想一想,这种题是不是可以用递归的方式解决
假设我们的当前节点是root,递归函数是rob
偷:当前的节点的金额数+rob(节点左树的子左树)+rob(节点左树的右树)+rob(节点右树的左树)+rob(节点右树的右树)
不偷:rob(节点的左树)+rob(节点的右树)
int rob=root.val+(root.left==null?0:rob(root.left.left)+rob(root.left.right))+(root.right==null?0:rob(root.right.right)+rob(root.right.left));int rob_not=rob(root.left)+rob(root.right);
这种递归大概率会超时,所以我们加一个记忆化数组,不用再进行重复计算(进行剪枝)
Map<TreeNode,Integer> map=new HashMap<>();if(map.containsKey(root)){return map.get(root);}
该题的大致流程就已经讲完了,希望大家可以看的开心,不懂的可以在评论区问我,我看到的话会给大家一一解答
Map<TreeNode,Integer> map=new HashMap<>();public int rob(TreeNode root) {if(root==null){return 0;}if(map.containsKey(root)){return map.get(root);}int rob=root.val+(root.left==null?0:rob(root.left.left)+rob(root.left.right))+(root.right==null?0:rob(root.right.right)+rob(root.right.left));int rob_not=rob(root.left)+rob(root.right);int max=Math.max(rob,rob_not);map.put(root,max);return max;}
相关文章:
面试热题(打家窃舍)
一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响小偷偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负…...
【Deepsort】C++版本Deepsort编译(依赖opencv,eigen3)
目录 下载源码安装onnxruntime安装Eigen3编译opencv 下载源码 https://github.com/shaoshengsong/DeepSORT安装onnxruntime 安装方法参考博客 安装Eigen3 当谈及线性代数计算库时,Eigen3是一个强大而受欢迎的选择。Eigen3是一个C模板库,提供了许多用…...
Synchronized锁升级过程
无锁状态(无锁):当一个线程访问一个没有被锁定的Synchronized代码块时,处于无锁状态。此时,线程可以直接进入临界区执行代码,不需要进行任何锁协调。 偏向锁状态(偏向锁)࿱…...
汽车电子功能安全
功能安全考虑 分析方法:FMEA,DFMEA(设计潜在失效模式和影响分析) 严重度(Severity),暴露率(Exposure),可控性(Controllability)评估…...
ARM进阶:内存屏障(DMB/DSB/ISB)的20个使用例子详解
在上一节内存屏障指令之DMB、DSB和ISB详解中,介绍了一下内存屏障的三个指令的作用并举了一些例子,对于内存屏障指令的使用时机,与处理器架构(比如Cortex-M和Cortex-A)和处理器的系统实现(同样的架构,有不同的实现,如ST…...
Cpp学习——模板
模板? 目录 模板? 1.介绍 2.函数模板的使用 3.函数模板的强制转换or显式调用 四,模板的分类 1.介绍 在Cpp3.0中,祖师爷便引入了模板的概念。这是一个重大的变革,为后来的Cpp标准化打下了铺垫。也正是因为有了模板࿰…...
HTTP 协议 版本详解
HTTP 协议 介绍<一> 简介 HTTP(Hypertext Transfer Protocol)是一种用于在客户端和服务器之间进行通信的协议。它是现代互联网中最常用的应用层协议之一。HTTP 的主要目的是实现超文本资源的传输,例如 HTML 文档、图像和音频文件等。…...
PHP语言基础知识(超详细)
文章目录 前言第一章 PHP语言学习介绍 1.1 PHP部署安装环境1.2 PHP代码工具选择 第二章 PHP代码基本语法 2.1 PHP函数知识介绍2.2 PHP常量变量介绍 2.2.1 PHP变量知识:2.2.2 PHP常量知识: 2.3 PHP注释信息介绍2.4 PHP数据类型介绍 2.4.1 整形数据类型2.4…...
Flex弹性盒子的项目属性
最近在写项目时用到了弹性盒子的项目属性,记录一下,以后用到继续扩充 <div class"concern-data"><div><img src"https://meituan.thexxdd.cn/lvyou/assets/pinglun-fc62482a.svg" alt""><span>1&…...
广州银行信用卡中心:强化数字引擎安全,实现业务稳步增长
广州银行信用卡中心是全国城商行中仅有的两家信用卡专营机构之一,拥有从金融产品研发至销售及后期风险控制、客户服务完整业务链条,曾获“2016年度最佳创新信用卡银行”。 数字引擎驱动业务增长 安全左移降低开发风险 近年来,广州银行信用卡…...
【Rust日报】2023-08-03 - Polars 获约 400 万美元种子轮融资
文章:2023 年对 Rust 编译器 CI 的改进 kobzol 的新文章,介绍了关于优化 Rust 编译器构建、测试和性能监视基础设施的方案和实施情况。 根据作者的工作,文章内容分为三类: Rust 编译器(rustc)构建配置、 Ru…...
装修小程序,开启装修公司智能化服务的新时代
随着数字化时代的来临,装修小程序成为提升服务质量和效率的关键工具。装修小程序旨在为装修公司提供数字化赋能、提高客户满意度的智慧装修平台。通过装修小程序,装修公司能够与客户进行在线沟通、展示设计方案、提高服务满意度等操作。 装修小程序的好处…...
使用PHP和Redis实现简单秒杀功能
安装Redis 首先,需要在服务器上安装Redis。如果使用Linux系统,可以使用命令行安装。如果使用Windows系统,可以下载并安装Redis二进制文件。 创建Redis连接 在PHP中,可以使用Redis扩展来连接Redis服务器。需要在PHP文件中包含Re…...
C#开发FFMPEG例子(API方式) FFmpeg拉取udp组播流并播放
代码及工程见https://download.csdn.net/download/daqinzl/88168680 开发工具:visual studio 2019 网上用C/C调用FFmpeg的API例子很多, c#使用ffmpeg.autogen的方式很简单,直接复制C/C调用FFmpeg的API的代码到C#中,然后在FFmpeg…...
Android性能优化—图片优化
图片优化是内存优化中很重要的一部分,加载Bitmap时往往需要消耗大量的内存,稍不注意就容易导致内存溢出(OOM)。 一、图片OOM问题产生 1、 一个页面一次加载过多图片; 2、加载大图片没有进行压缩(尺寸,质…...
如何搭建自动化测试框架?资深测试整理的PO模式,一套打通自动化...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Po模型介绍 1、简…...
软件外包开发的GO语言特点
Go语言(也称为Golang)是由Google开发的一种编程语言。它具有许多特点,使其成为许多项目范围的优秀选择。Go语言适用于需要高性能、并发和简洁易读的项目,特别是面向网络和分布式应用的项目。今天和大家分享项目的特点及适用的项目…...
【深度学习Week4】MobileNet_ShuffleNet
报错:unsafe legacy renegotiation disabled 解决方案: 尝试了更换cryptography36.0.2版本,以及更换下载链接的方法,都不行,最后采用了手动下载mat文件并上传到colab的方法 高光谱图像分类数据集简介Indian Pines&…...
649. Dota2 参议院
题目描述: 主要思路: 这是一个按照题意模拟的问题,利用队列模拟议员的投票顺序即可。 class Solution { public:string predictPartyVictory(string senate) {queue<int> r,d;int nsenate.length();for(int i0;i<n;i){if(senate[i…...
无人机管控平台,推动电力巡检管理水平提升
各地区无人机作业水平和管理水平存在参差不齐,电力巡检管理要求与业务发展水平不匹配的问题。同时,巡检数据的存储和管理分散,缺乏有效的整合与共享手段,使得内外业脱节,没有形成统一应用和闭环管理。这就导致巡检数据…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
