LeetCode - #198 打家劫舍

在这里插入图片描述
在这里插入图片描述

网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:极星会首批签约作者

文章目录

    • 摘要
    • 描述
    • 题解答案
    • Swift 代码实现
    • 题解代码分析
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

本文将介绍如何用 动态规划(Dynamic Programming, DP) 解决经典的 “打家劫舍”(House Robber) 问题。我们将提供 Swift 代码实现,并对其进行详细分析,包括时间复杂度、空间复杂度、代码逻辑解析,以及可运行的测试示例。

描述

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

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

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

题解答案

这个问题适合使用 动态规划(DP) 来解决。我们定义:

  • dp[i]:表示 前 i 间房屋 能偷窃到的最大金额。

状态转移方程:

  • 偷当前房屋(i)dp[i] = nums[i] + dp[i-2]
  • 不偷当前房屋(i)dp[i] = dp[i-1]
  • 取两者较大值dp[i] = max(dp[i-1], nums[i] + dp[i-2])

初始化条件:

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

Swift 代码实现

import Foundationfunc rob(_ nums: [Int]) -> Int {let n = nums.countif n == 0 { return 0 }if n == 1 { return nums[0] }var dp = Array(repeating: 0, count: n)dp[0] = nums[0]dp[1] = max(nums[0], nums[1])for i in 2..<n {dp[i] = max(dp[i-1], nums[i] + dp[i-2])}return dp[n-1]
}// 示例测试
let houses1 = [1,2,3,1]
let houses2 = [2,7,9,3,1]print(rob(houses1))  // 输出: 4
print(rob(houses2))  // 输出: 12

题解代码分析

  1. 定义动态规划数组 dp[i],记录偷窃前 i 间房屋能得到的最高金额。
  2. 初始化边界值
    • dp[0] = nums[0],即如果只有一间房,则只能偷它的金额。
    • dp[1] = max(nums[0], nums[1]),如果有两间房,只能偷金额较大的那一间。
  3. 状态转移
    • 不偷当前房屋:金额和前一个房屋相同 dp[i] = dp[i-1]
    • 偷当前房屋:金额等于当前房屋的钱 nums[i] 加上 dp[i-2]
    • 取两者最大值dp[i] = max(dp[i-1], nums[i] + dp[i-2])
  4. 返回最终结果 dp[n-1]

示例测试及结果

输入

let houses = [2,7,9,3,1]
print(rob(houses))

输出

12

时间复杂度

  • 遍历 nums 一次,每个元素进行 O(1) 操作,因此时间复杂度为 O(n)

空间复杂度

  • 由于使用了 dp 数组存储 n 个元素,空间复杂度为 O(n)
  • 优化方案:只用两个变量 prev1prev2 代替 dp 数组,可以将空间复杂度降为 O(1)

优化代码:

func robOptimized(_ nums: [Int]) -> Int {var prev1 = 0, prev2 = 0for num in nums {let temp = max(prev1, num + prev2)prev2 = prev1prev1 = temp}return prev1
}

总结

  1. 解法

    • 动态规划,状态 dp[i] = max(dp[i-1], nums[i] + dp[i-2])
    • 优化:用 prev1prev2 变量代替数组,节省 O(n) 的空间。
  2. 时间复杂度

    • O(n),因为只遍历了一次数组。
  3. 空间复杂度

    • 标准解法O(n)
    • 优化解法O(1)
  4. 适用场景

    • 适用于序列优化问题,比如游戏关卡最优选择、投资最优策略等。

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

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

相关文章

验证工具:SVN版本控制

1-SVN概念 SVN(Subversion)是一种集中式版本控制系统,它用于文件和目录的版本管理,允许多个用户协同工作,同时追踪每个文件和目录的历史修改记录。以下是关于SVN版本控制的详细介绍: 一、SVN的基本概念 仓库(Repository):SVN的仓库是一个集中存储所有文件和目录的地…

【DeepSeek】本地私有化部署 DeepSeek 模型教程

一、引言 DeepSeek 模型是一种强大的语言模型&#xff0c;本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型&#xff0c;避免数据传输到外部带来的安全风险&#xff0c;同时也能根据自身需求进行定制化配置。本教程将详细介绍如何在本地进行 DeepSeek 模型的私有…

【玩转 Postman 接口测试与开发2_016】第13章:在 Postman 中实现契约测试(Contract Testing)与 API 接口验证(上)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十三章 契约测试与 API 接口验证1 契约测试的概念2 契约测试的工作原理3 契约测试的分类4 DeepSeek 给出的契约测试相关背景5 契约测试在 Postman 中的创建方法6 API 实例的基本用法7 API 实例的类型实…

为什么“记住密码”适合持久化?

✅ 特性 1&#xff1a;应用重启后仍需生效 记住密码的本质是长期存储用户的登录凭证&#xff08;如用户名、密码、JWT Token&#xff09;&#xff0c;即使用户关闭应用、重启设备&#xff0c;仍然可以自动登录。持久化存储方案&#xff1a; React Native 推荐使用 AsyncStorag…

echarts、canvas这种渲染耗时的工作能不能放在webworker中做?

可以将 ECharts、Canvas 等渲染耗时的工作放在 Web Worker 中进行处理。Web Worker 允许在后台线程中运行 JavaScript&#xff0c;从而将计算密集型任务从主线程中分离出来&#xff0c;避免阻塞用户界面。以下是一些关键点&#xff1a; 优势 性能提升&#xff1a;将耗时的渲染…

proxmox通过更多的方式创建虚拟机

概述 作为一名资深运维工程师&#xff0c;我们经常需要在 Proxmox 虚拟化平台上创建和管理虚拟机。本文将介绍三种不同的方式在 Proxmox 上创建 Ubuntu 虚拟机&#xff1a; 通过 Proxmox 命令创建虚拟机通过 Shell 脚本自动化创建虚拟机使用 Proxmox API 创建虚拟机 每种方式…

【分布式架构理论3】分布式调用(2):API 网关分析

文章目录 一、API 网关的作用1. 业务层面&#xff1a;简化调用复杂性2. 系统层面&#xff1a;屏蔽客户端调用差异3. 其他方面&#xff1a; 二、API 网关的技术原理1. 协议转换2. 链式处理3. 异步请求机制1. Zuul1&#xff1a;同步阻塞处理2. Zuul2&#xff1a;异步非阻塞处理 三…

使用线性回归模型逼近目标模型 | PyTorch 深度学习实战

前一篇文章&#xff0c;计算图 Compute Graph 和自动求导 Autograd | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 使用线性回归模型逼近目标模型 什么是回归什么是线性回归使用 PyTorch 实现线性回归模型代码执行结…

20250205——Windows系统基于ollama的DeepSeek-R1本地安装

1、安装ollama 1.1 Windows系统 打开ollama官网链接Download Ollama on Windows&#xff0c;根据自己的系统下载安装包&#xff0c;如果是Windows系统&#xff0c;下载Windows版本。 1.1 Linux系统 &#xff08;这个是因为运行遇到报错了&#xff0c;想自己记录一下解决方法&a…

VSCode中使用EmmyLua插件对Unity的tolua断点调试

一.VSCode中搜索安装EmmyLua插件 二.创建和编辑launch.json文件 初始的launch.json是这样的 手动编辑加上一段内容如下图所示&#xff1a; 三.启动调试模式&#xff0c;并选择附加的进程

java-关键字(final,static)

关键字 final 和 static 是两个常用的关键字&#xff0c;它们分别用于不同的场景&#xff0c;具有不同的作用。 final final 关键字用于表示某个实体是不可变的。它可以应用于变量、方法和类。 final 变量 当 final 用于变量时&#xff0c;表示该变量一旦被初始化后&#…

pytorch基于FastText实现词嵌入

FastText 是 Facebook AI Research 提出的 改进版 Word2Vec&#xff0c;可以&#xff1a; ✅ 利用 n-grams 处理未登录词 比 Word2Vec 更快、更准确 适用于中文等形态丰富的语言 完整的 PyTorch FastText 代码&#xff08;基于中文语料&#xff09;&#xff0c;包含&#xff1…

JVS低代码逻辑引擎多种业务场景触发案例配置:涵盖列表页按钮、表单数据、流程审批、外部API接口调用等

逻辑引擎作为JVS低代码开发套件的核心组件&#xff0c;专注于业务逻辑的快速构建与实现&#xff0c;它扮演着程序配置与执行的核心角色&#xff0c;适用于多样化的应用场景。该逻辑引擎设计灵活&#xff0c;能够通过多种配置方式被触发&#xff0c;以精准响应各类业务需求并实现…

文字加持:让 OpenCV 轻松在图像中插上文字

前言 在很多图像处理任务中,我们不仅需要提取图像信息,还希望在图像上加上一些文字,或是标注,或是动态展示。正如在一幅画上添加一个标语,或者在一个视频上加上动态字幕,cv2.putText 就是这个“文字魔术师”,它能让我们的图像从“沉默寡言”变得生动有趣。 今天,我们…

2024年12月 Scratch 图形化(四级)真题解析 中国电子学会全国青少年软件编程等级考试

202412 Scratch 图形化&#xff08;四级&#xff09;真题解析 中国电子学会全国青少年软件编程等级考试 一、选择题(共10题&#xff0c;共30分) 第 1 题 列表存放全班同学的身高&#xff0c;小猫运行下列程序&#xff0c;下列选项说法正确的是&#xff1f;&#xff08; &#…

基于springboot的在线BLOG博客网

作者&#xff1a;学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”&#xff0c;支持远程部署调试、运行安装。 项目包含&#xff1a; 完整源码数据库功能演示视频万字文档PPT 项目编码&#xff1…

trinitycore服务器离线,原来是mysql里数据库flag设置为2离线状态了

先上结论&#xff1a; 登录trinitycore服务器的时候&#xff0c;显示服务器离线&#xff0c;原来是mysql里数据库flag设置为2离线状态了。修改flag的值为0&#xff0c;服务器就在线了&#xff0c;问题解决。 问题&#xff1a; 登录trinitycore服务器的时候&#xff0c;显示服…

ASP.NET Core Filter

目录 什么是Filter&#xff1f; Exception Filter 实现 注意 ActionFilter 注意 案例&#xff1a;自动启用事务的筛选器 事务的使用 TransactionScopeFilter的使用 什么是Filter&#xff1f; 切面编程机制&#xff0c;在ASP.NET Core特定的位置执行我们自定义的代码。…

Colorful/七彩虹 隐星P15 TA 24 原厂Win11 家庭版系统 带F9 Colorful一键恢复功能

Colorful/七彩虹 隐星P15 TA 24 原厂Win11 家庭中文版系统 带F9 Colorful一键恢复功能 自动重建COLORFUL RECOVERY功能 带所有随机软件和机型专用驱动 支持机型&#xff1a;隐星P15 TA 24 文件下载&#xff1a;asusoem.cn/745.html 文件格式&#xff1a;ISO 系统版本&…

Unity游戏(Assault空对地打击)开发(3) 摄像机的控制

详细步骤 打开My Assets或者Package Manager。 选择Unity Registry。 搜索Cinemachine&#xff0c;找到 Cinemachine包&#xff0c;点击 Install按钮进行安装。 关闭窗口&#xff0c;新建一个FreeLook Camera&#xff0c;如下。 接着新建一个对象Pos&#xff0c;拖到Player下面…