当前位置: 首页 > news >正文

力扣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
from typing import Listclass Solution:def rob(self, nums: List[int]) -> int:# 如果房屋数量为 0,直接返回 0,因为没有房子可偷if len(nums) == 0:return 0# 如果房屋数量为 1,返回唯一一间房屋的金额if len(nums) == 1:return nums[0]# 如果房屋数量为 2,返回两者中较大的金额if len(nums) == 2:return max(nums[0], nums[1])# 创建一个 dp 数组,其中 dp[i] 表示偷到第 i 间房屋时能获取的最大金额dp = [0] * len(nums)# 初始化前两间房屋的最大偷窃金额dp[0] = nums[0]  # 第一间房屋只能偷它自己dp[1] = max(nums[0], nums[1])  # 第二间房屋可以选择偷第一间或第二间,取金额较大者# 从第 3 间房屋开始,计算每间房屋的最大偷窃金额for i in range(2, len(nums)):# 对于第 i 间房屋,可以选择:# 1. 偷它,并加上偷第 i-2 间房屋的最大金额(因为相邻房屋不能同时偷)# 2. 不偷它,直接取第 i-1 间房屋的最大金额dp[i] = max(dp[i-2] + nums[i], dp[i-1])# 返回最后一间房屋对应的最大偷窃金额,即为结果return dp[-1]

解释:

  1. 特殊情况处理

    • 如果房屋数量为 0,则返回 0,因为没有房屋可以偷。
    • 如果房屋数量为 1,则返回第一个房屋的金额,因为只能偷这一间。
    • 如果房屋数量为 2,则只能偷其中金额较大的一间,因此返回这两者中的最大值。
  2. 动态规划数组 dp

    • dp[i] 代表到达第 i 间房屋时,小偷能偷到的最大金额。
    • 初始化 dp[0] 为第一个房屋的金额,dp[1] 为前两间房屋中金额较大的值。
  3. 动态规划递推

    • 对于每一间房屋,从第 3 间开始(即下标为 2 的房屋),有两种选择:
      1. 偷这一间房屋,加上第 i-2 间房屋的最大金额。
      2. 不偷这一间房屋,取前一间房屋的最大金额。
    • 在这两者中选择较大的值更新 dp[i],保证每一步都获得最大金额。
  4. 结果返回

    • dp[-1] 即为偷窃到最后一间房屋时的最大金额,也就是最终答案。

dp 是动态规划(Dynamic Programming)的简称,它是一种常见的算法设计思想,用来解决具有重叠子问题和最优子结构的问题。动态规划通过将问题分解为更小的子问题,记录这些子问题的解,然后根据这些子问题的解来构造出原问题的解,从而避免重复计算。

在这个小偷问题中,dp 是一个数组,用来存储每个子问题的最优解,具体来说:

  • dp[i] 表示到达第 i 间房屋时,能够偷到的最大金额。这个数组记录了在每个房屋时,如何做出选择(偷还是不偷),使得偷窃的总金额最大。

动态规划的关键概念:

  1. 重叠子问题: 动态规划适用于那些可以通过递归或分解为相似的子问题解决的情况。比如,在小偷问题中:

    • 如果你决定偷第 i 间房屋,那么你还需要知道偷第 i-2 间房屋能得到的最大金额(因为相邻的房子不能同时偷)。
    • 如果你不偷第 i 间房屋,那么你只需要知道偷第 i-1 间房屋的最大金额。
  2. 最优子结构: 问题的整体最优解可以由其子问题的最优解构成。在这个问题中,偷窃第 i 间房屋的最优解可以通过第 i-2 间房屋和第 i-1 间房屋的最优解推导出来。

举个例子解释 dp 的含义:

假设房屋里的金额是 [2, 7, 9, 3, 1],小偷希望能偷到最多的钱但不能偷相邻的房子。

  • dp[0] = 2:表示只看第 1 间房屋时,最多能偷 2 元。
  • dp[1] = 7:表示只看前两间房屋时,最多能偷 7 元(因为第 2 间房屋钱更多,偷第 1 间房屋不划算)。
  • dp[2] = max(dp[0] + nums[2], dp[1]) = max(2 + 9, 7) = 11:表示到第 3 间房屋时,可以选择偷第 1 间和第 3 间房屋(共 2 + 9 = 11 元),或者只偷前两间房屋(共 7 元),所以偷第 1 和第 3 间房屋的总金额最大。
  • dp[3] = max(dp[1] + nums[3], dp[2]) = max(7 + 3, 11) = 11:到第 4 间房屋时,最优解是保持偷前 3 间房屋的最大金额(11 元),因为偷第 2 间和第 4 间的金额不比之前多。
  • dp[4] = max(dp[2] + nums[4], dp[3]) = max(11 + 1, 11) = 12:到第 5 间房屋时,最优解是偷第 1、3、5 间房屋,总金额为 12 元。

动态规划公式:

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

这个公式的意思是,对于每一间房屋 i,你有两个选择:

  1. 偷它,然后加上两间前房屋(i-2)的最大偷窃金额。
  2. 不偷它,只取前一间房屋(i-1)的最大偷窃金额。

通过这样递推计算,我们可以得出小偷能在不触发警报的情况下,偷窃的最高金额。

总结:

  • dp 是动态规划的核心工具,它用于存储每个子问题的最优解。
  • 动态规划方法通过分解问题,利用以前的结果,避免了重复计算,使得算法更高效。

相关文章:

力扣198-打家劫舍

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

Python 入门教程(4)数据类型 | 4.1、数据类型

文章目录 一、数据类型1、弱类型与强类型2、变量没有类型&#xff0c;数据有类型3、不可变类型和可变类型 前言&#xff1a; Python 是一种高级编程语言&#xff0c;以其简洁的语法、丰富的内置库和动态类型系统而闻名。在 Python 中&#xff0c;数据类型是编程的基础&#xff…...

如何进行DAP-seq的数据挖掘,筛选验证位点

从样本准备到寄送公司&#xff0c;每一天都在“祈祷”有个心仪的分析结果&#xff0c;终于在这天随着邮件提示音的响起&#xff0c;收到了分析结果...... 分析前工作 爱基在进行数据分析之前&#xff0c;会有两次质控报告反馈给老师们。第一个&#xff0c;基因组DNA的提取质控…...

学习大数据DAY56 业务理解和第一次接入

作业1 1 了解行业名词 ERP CRM OA MES WMS RPA SAAS 了解每个系统的功能和应用 ERP 系统&#xff0c;&#xff08;Enterprise Resource Planning&#xff0c;企业资源计划系统&#xff09;&#xff1a;ERP 系统 是一种用于管理企业各类资源的软件系统&#xff0c;包括生产管理…...

java线程池编程示例

程序功能 这段代码展示了如何使用 Java 线程池 来并发执行多个任务。通过创建一个固定大小为 3 的线程池&#xff0c;程序提交了 5 个任务&#xff0c;并让线程池中的线程并发处理这些任务。每个任务模拟了一个耗时操作&#xff0c;最后程序等待所有任务完成后关闭线程池。 …...

02 基于STM32的按键控制继电器驱动电机

本专栏所有源资料都免费获取&#xff0c;没有任何隐形消费。 注意事项&#xff1a;STM32仿真会存在各种各样BUG&#xff0c;且尽量按照同样仿真版本使用。本专栏所有的仿真都采用PROTEUS8.15。 本文已经配置好STM32F103C8T6系列&#xff0c;在PROTUES仿真里&#xff0c;32单片…...

网页本地存储

网页本地存储 <html> <script>//添加数据function add(){var text;textdocument.getElementById(text).value;indexlocalStorage.length1;localStorage.setItem(index,text);}//显示localStorage所有内容function showall(){storagelocalStorage;var length stor…...

SpringBoot2:web开发常用功能实现及原理解析-@ControllerAdvice实现全局异常统一处理

文章目录 前言1、工程包结构2、POM依赖3、Java代码 前言 本篇主要针对前后端分离的项目&#xff0c;做的一个统一响应包装、统一异常捕获处理。 在Spring里&#xff0c;我们可以使用ControllerAdvice来声明一些关于controller的全局性的东西&#xff0c;其用法主要有以下三点…...

DockerLinux安装DockerDocker基础

Linux软件安装 yum命令安装 通过yum命令安装软件,是直接把软件安装到Linux系统中 安装和卸载都比较麻烦,因为软件和系统是强关联的 Docker docker是一种容器技术,可以解决软件和系统强关联关系,使得软件的安装和卸载更方便,它可以将我们的应用以及依赖进行打包,制作出一个镜…...

macOS平台TensorFlow环境安装

1.安装xtarfile pip3 install xtarfile 2.安装 pip3 install matplotlib 3.安装jieba pip3 install jieba 4.安装 pip3 install tensorflow tensorflow安装成功...

全网最全 线程邮箱

线程邮箱的优缺点 优点 避免资源竞争&#xff1a;线程邮箱通过队列和互斥锁来管理线程间的通信&#xff0c;确保只有持有锁的线程可以访问和修改队列中的数据&#xff0c;从而避免了多个线程同时尝试修改同一资源时可能出现的竞争条件&#xff0c;减少了因资源竞争导致的死锁…...

Linux下rpm方式部署mysql(国产化生产环境无联网服务器部署实操)

请放心观看&#xff0c;已在正式环境部署验证&#xff0c;流程无问题&#xff01; 所用系统为国产化麒麟银河 aarch64系统&#xff0c;部署时间2024年9月份&#xff01; #查看服务器信息 #涉及生产服务器&#xff0c;所以输出信息隐藏了一部分[rootecs-xxxxx hdata]# uname -…...

【Python机器学习】NLP信息提取——正则模式

我们需要一种模式匹配算法&#xff0c;该算法可以识别与模式匹配的字符序列或词序列&#xff0c;以便从较长的文本字符串中“提取”它们。构建这种模式匹配算法的简单方法是在Python中&#xff0c;使用一系列if/else语句在字符串的逐个位置查找该符号&#xff08;单词或字符&am…...

opc服务器与opc服务器如何通讯

OPC&#xff08;OLE for Process Control&#xff0c;即过程控制对象链接&#xff09;是一种工业自动化领域常用的通讯协议&#xff0c;它提供了一种标准化的方式&#xff0c;使得不同厂家的设备可以互相通讯。OPC服务器是运行在计算机上的软件程序&#xff0c;用于接收和处理来…...

指针 (六)

OK&#xff0c;书接上回&#xff0c;咱们继续&#xff1a; 一 . 函数指针变量 &#xff08;1&#xff09;函数指针变量的创建 首先我们得明白&#xff0c;什么是函数指针变量呢&#xff1f;从我们之前学习过的整型指针&#xff0c;数组指针的相关知识当中&#xff0c;通过类…...

Linux下vscode配置C++和python编译调试环境

Visual Studio Code (简称 VSCode) 是由微软开发的一款免费、开源、跨平台的代码编辑器。它支持 Windows、macOS 和 Linux 操作系统&#xff0c;并且内置对多种编程语言的支持&#xff0c;包括但不限于 C/C、Python、JavaScript、TypeScript、Java 和 Go 等。VSCode 主要用于编…...

OrionX GPU算力池助力AI OCR场景应用

01 AI OCR的历史及概念 OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;是指采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件&#xff0c;通过检测暗、亮的模式确定其形状&#xff0c;然后用字符识别方法将形状翻译成计算机文…...

移动端如何实现智能语音交互

智能语音交互&#xff08;Intelligent Speech Interaction&#xff09;是基于语音识别、语音合成、自然语言理解等技术&#xff0c;为企业在多种实际应用场景下&#xff0c;赋予产品“能听、会说、懂你”式的智能人机交互功能。适用于智能问答、智能质检、法庭庭审实时记录、实…...

HTTPS:构建安全通信的基石

HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;&#xff0c;作为互联网上安全通信的基石&#xff0c;通过在HTTP基础上引入SSL/TLS协议层&#xff0c;实现了数据传输的加密&#xff0c;确保了信息的机密性、完整性和真实性。这一过程涉及多个精细设计的步骤…...

OceanBase 企业版OMS 4.2.3的使用

OceanBase 企业版OMS 4.2.3的使用 一、界面说明 1.1 概览 1.2 数据迁移 1.3 数据同步 1.4 数据源管理 1.5 运维监控 1.6 系统管理 二、功能说明 注意&#xff1a; 在数据迁移与数据同步的功能中&#xff0c;如果涉及到增量操作&#xff1a; 1.需要使用sys租户的用…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...