代码随想录算法训练营第39天|198.打家劫舍、 213.打家劫舍II、337. 打家劫舍 III

news2024/11/17 2:56:40

目录

  • 198.打家劫舍
    • 1、题目描述
    • 2、思路
    • 3、code
    • 4、复杂度分析
  • 213.打家劫舍II
    • 1、题目描述
    • 2、思路
    • 3、code
    • 4、复杂度分析
  • 337. 打家劫舍 III
    • 1、题目描述
    • 2、思路
    • 3、code
    • 4、复杂度分析

198.打家劫舍

题目链接:添加链接描述

1、题目描述

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

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

2、思路

重叠子问题: 当前房屋偷与不偷取决于 前一个房屋和前两个房屋是否被偷了

1️⃣ 确定dp数组(dp table)以及下标的含义
dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。
2️⃣ 确定递推公式
对于房屋i,有两种选择:

  • 偷:dp[i] = dp[i-2] + nums[i]
  • 不偷:dp[i] = dp[i-1]
  • d p [ i ] = m a x ( d p [ i − 2 ] + n u m s [ i ] , d p [ i − 1 ] ) dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]) dp[i]=max(dp[i2]+nums[i],dp[i1])

3️⃣ 初始化

  • dp[0] = nums[0]
  • dp[1] = max(nums[0],nums[1])

4️⃣ 遍历顺序:从前到后

3、code

class Solution:
    def rob(self, nums: List[int]) -> int:
        if len(nums) == 1:
            return nums[0]
        # dp[i] 代表偷到第i个房屋能偷窃的最高金额 i:0,,,n-1
        dp = [0] * len(nums) # dp[3]
        # 对于房屋i,有两种选择:
        # 偷:dp[i] = dp[i-2] + nums[i]
        # 不偷:dp[i] = dp[i-1]
        dp[0] = nums[0]
        dp[1] = max(nums[0],nums[1])
        for i in range(2,len(nums)):
            dp[i] = max(dp[i-2]+nums[i],dp[i-1])
        return dp[-1]

4、复杂度分析

1️⃣ 时间复杂度: O ( N ) O(N) O(N)
2️⃣ 空间复杂度: O ( N ) O(N) O(N)

213.打家劫舍II

题目链接:link

1、题目描述

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。 同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。
给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

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

2、思路

上一道题是普通的数组,这一道题是成环的数组,如何用普通的数组来表示成环的数组?
普通的数组和成环的数组的区别就是:普通数组可以同时考虑首元素和尾元素,但是成环的数组要分为三种情况:
情况一:考虑不包含首尾元素
在这里插入图片描述
情况二:考虑包含首元素,不包含尾元素
在这里插入图片描述
情况三:考虑包含尾元素,不包含首元素
213.打家劫舍II2
🔥 考虑首元素不代表选首元素,“考虑”代表这个元素使有可能被打劫的,但是要根据动态规划的公式来判断是否打劫
情况二 和 情况三 都包含了情况一了,所以只考虑情况二和情况三就可以

3、code

class Solution:
    def rob(self, nums: List[int]) -> int:
        if len(nums) == 1:
            return nums[0]
        if len(nums) == 2:
            return max(nums[0],nums[1])
        res1 = self.robrange(0,len(nums)-2,nums)
        res2 = self.robrange(1,len(nums)-1,nums)
        return max(res1,res2)

    def robrange(self,start,end,nums):
        if start == end:
            return nums[start]
        if end - start == 1:
            return max(nums[start],nums[start+1])
        dp = [0] * (end-start+1)
        dp[0] = nums[start]
        dp[1] = max(nums[start],nums[start+1])
        for i in range(2,end-start+1):
            dp[i] = max(dp[i-1],dp[i-2]+nums[start+i])
        return dp[-1]

4、复杂度分析

1️⃣ 时间复杂度: O ( N ) O(N) O(N)
2️⃣ 空间复杂度: O ( N ) O(N) O(N)

337. 打家劫舍 III

题目链接:link

1、题目描述

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。
除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。
给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额 。
在这里插入图片描述

2、思路

1️⃣ 对于每一个节点有两种选择,偷或者不偷

  • 偷:dp[1]
  • 不偷:dp[0]

2️⃣ 遍历终止条件:空节点,偷不偷都是0,return (0,0)

3️⃣ 后序递归
要想知道两个孩子的结果,才能计算当前偷或者不偷的结果

  • 偷当前节点:左右孩子就不能偷了
    • d p [ 1 ] = v a l + l e f t d p [ 0 ] + r i g h t d p [ 0 ] dp[1] = val + leftdp[0] + rightdp[0] dp[1]=val+leftdp[0]+rightdp[0]
  • 不偷当前节点:左右孩子可偷可不偷,选大的
    • d p [ 0 ] = m a x ( l e f t d p [ 0 ] , l e f t d p [ 1 ] ) + m a x ( r i g h t d p [ 0 ] , r i g h t d p [ 1 ] ) dp[0] = max(leftdp[0],leftdp[1]) + max(rightdp[0],rightdp[1]) dp[0]=max(leftdp[0],leftdp[1])+max(rightdp[0],rightdp[1])

3、code

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def rob(self, root: Optional[TreeNode]) -> int:
        res = self.travelsal(root)
        return max(res[0],res[1])
    def travelsal(self,node):
        # 返回两个数,分别是不选这个节点的最高金额,和选这个节点的最高金额
        if node is None:
            return (0,0)
        left = self.travelsal(node.left)
        right = self.travelsal(node.right)
        # 如果不选这个节点,就选左右最大值
        res_0 = max(left[0],left[1]) + max(right[0],right[1])
        # 如果选这个节点,那么子树肯定是不选的
        res_1 = node.val + left[0] + right[0]
        return (res_0,res_1)

代码递归顺序:
在这里插入图片描述

4、复杂度分析

1️⃣ 时间复杂度: O ( N ) O(N) O(N),每个节点只遍历了一次
2️⃣ 空间复杂度: O ( l o g n ) O(log n) O(logn),算上递推系统栈的空间❓

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

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

相关文章

8、用户行为数据同步

1、 数据通道 用户行为数据由Flume从Kafka直接同步到HDFS,由于离线数仓采用Hive的分区表按天统计,所以目标路径要包含一层日期。具体数据流向如下图所示。 2、 日志消费Flume配置概述 按照规划,该Flume需将Kafka中topic_log的数据发往HDFS。…

cmake编译MQTT-C源码

Windows端编译MQTT-C源码,获取mqttc库(动态库与静态库),用于集成到Qt工程中使用mqtt订阅与发布功能。 编译源码与编译出来的mqttc动态库、静态库下载​​​​​​​​​​​​​​https://download.csdn.net/download/qq_38159549…

直播怎么录屏?录屏网页的工具有吗?推荐这3款你千万不要错过~

直播与网页录屏:三款必备录屏软件推荐 为什么要记录直播?直播可以捕捉实时发生事件,是真真实实的one take,更重要的是可以记录直播画面中的实时弹幕、评论区的互动,无论是激动人心的体育赛事、教育课程还是互动性强的连…

C++11 14 17 20 23进化史

C11、C14、C17、C20和C23是C语言标准的不同版本,它们之间在功能、特性和语法上存在一些区别。以下是对这些版本主要区别的概述: C11 C11是C语言的一个重要标准,引入了大量新特性和改进,使C变得更加易用和强大。主要特性包括&…

Qt工程使用MQTT-C库与mqtt服务器数据通信

实现mqtt订阅与发布话题,与mqtt服务器进行数据通信 编译环境:Qt5.15.2 vs2019 需要mqttc库:mqttc.lib, mqttc.dll(根据MQTT-C源码编译出来的库,参考cmake编译MQTT-C源码-CSDN博客) 一、Qt pro文件编写 …

android kotlin 基础复习 继承 inherit

1、新建文件kt 2、代码: /**用户基类**/ open class Person1(name:String){/**次级构造函数**/constructor(name:String,age:Int):this(name){//初始化println("-------基类次级构造函数---------")println("name:${name},age:${age}")} }/**子…

信息安全工程师(1)计算机网络分类

一、按分布范围分类 广域网(WAN): 定义:广域网的任务是提供长距离通信,运送主机所发送的数据。其覆盖范围通常是直径为几十千米到几千千米的区域,因此也被称为远程网。特点:连接广域网的各个结点…

计算机毕业设计 财会信息管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

【吊打面试官系列-Redis面试题】怎么理解 Redis 事务?

大家好,我是锋哥。今天分享关于【怎么理解 Redis 事务?】面试题,希望对大家有帮助; 怎么理解 Redis 事务? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 1)事务是一个单独的隔离操作&#xff1…

【LabVIEW学习篇 - 22】:ActiveX

文章目录 ActiveXActiveX打开Windows颜色选择对话框ActiveX将浏览器嵌入到前面板 ActiveX ActiveX是微软推出的一个开放的技术集的统称,它是很早之前出现的OLE(object linking and Embedding)技术的扩展,它是基于COM(Component Object Model)技术而建立…

meta元素

1&#xff0c;meta元素有4个全局属性 charset 设置文档的编码类型&#xff0c;通常设置为utf-8 <meta charset"utf-8" /> content 配合name或者http-equiv属性使用&#xff0c;为其value、 name 元数据名称(name的值)说明application name当前页所属Web应用系…

进程替换篇

文章目录 目录 前言 1.进程替换概念 2.进程替换的原理 3.进程替换的接口 4.接口功能验证 ①execl接口演示 ②execlp接口演示 ③execle接口演示 ④execv接口验证 5.尝试写一个自己的shell【了解】 前言 你一定见过类似于这样的“黑框框”&#xff0c;这个“黑框框”其实就是…

js 请求api + 解析数据 2个例子

起因&#xff0c; 目的: 补补 js 基础。 例1&#xff0c; 请求天气 api&#xff0c; 天气数据api js 中的 await await 关键字只能在 async 函数内部使用。函数内部可以使用 await&#xff0c;但是在函数外部直接使用 await 是不允许的。 async function fetchWeatherData…

[mysql]最基本的SELECT...FROM结构

第0种&#xff1a;最基本的查询语句 SELECT 字段名&#xff0c;字段名 FROM 表名 SELECT 1&#xff1b; SELECT 11,3*2&#xff1b; FROM SELECT 11,3*2 FROM DUAL&#xff1b;#dual&#xff1a;伪表 我们可以用它来保持一个平衡 这里我们的值不需要在任何一个表里&#xf…

MyBaits的初理解

一.Mybaits的简介 Mybaits就是对JDBC的简化&#xff0c;就是对持久化的实现。 二.基础 需要导的dependencies <dependencies><!-- mybatis依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId>&l…

第 5 章多视图几何

本章讲解如何处理多个视图&#xff0c;以及如何利用多个视图的几何关系来恢复照相机位置信息和三维结构。通过在不同视点拍摄的图像&#xff0c;我们可以利用特征匹配来计算出三维场景点以及照相机位置。本章会介绍一些基本的方法&#xff0c;展示一个三维重建的完整例子&#…

获取多行文本内容,去掉首尾空格、去掉空字符串,解析为文本数组

核心代码 // 获取多行文本内容&#xff0c;去掉首尾空格、去掉空字符串&#xff0c;解析为文本数组 getMultiLineTexts(textareaValue) {return textareaValue.split("\n").map((v) > v.split("\t").join("").trim()).filter((v, i, ar) &g…

Qt | ubuntu20.04安装Qt6.5.3并创建一个example完整教程(涉及诸多开发细节,商用慎重)

点击上方"蓝字"关注我们 01、下载 >>> 下载Qt在线安装包 这里采用镜像地址进行下载,避免网络过慢。 镜像地址:http://mirrors.ustc.edu.cn/qtproject/archive/online_installers/4.5/ 选择最新版本下载,如截至目前最新版本为qt-unified-linux-x64-4.5.2…

“探索数字孪生技术:细数其在各行业的实际应用场景“

数字孪生城市是指在数字世界中创建一个同物理实体城市外观一致、行动一致、思想一致的 数字虚拟城市&#xff0c;实现对现实世界的监测、诊断、回溯、预测和决策控制&#xff0c;用于实体城市的规划、建设、 治理和优化等全生命周期管理&#xff0c;提高城市运行效率和市民居住…

内网穿透的应用-Deepin系统安装x11vnc实现任意设备无公网IP远程连接Deepin桌面

文章目录 前言1. 安装x11vnc2. 本地远程连接测试3. Deepin安装Cpolar4. 配置公网远程地址5. 公网远程连接Deepin桌面6. 固定连接公网地址7. 固定公网地址连接测试 前言 本文主要介绍在Deepin系统中安装x11vnc工具&#xff0c;并结合Cpolar内网穿透工具实现任意设备无公网IP也可…