動態規劃題解_打家劫舍【LeetCode】

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 。

這個問題的核心思想是動態規劃。我們可以將問題分解為子問題:

  • 對于每個房子?i,我們有兩種選擇:偷或不偷。
  • 如果我們偷了第?i?個房子,那么我們不能偷第?i-1?個房子,所以最大金額是?dfs(i - 2) + nums[i]
  • 如果我們不偷第?i?個房子,那么最大金額是?dfs(i - 1)
  • 我們取這兩種選擇中的最大值作為?dfs(i)?的結果。

?下面關于這道題目的具體題解,思路和之前的爬樓梯題目解題思路一致,建議先看完這篇文檔再來繼續食用哦~~

動態規劃題解——爬樓梯【LeetCode】三種方法_動態規劃 爬樓梯-CSDN博客


一、算法邏輯(每一步思路)

? 問題描述:

給定一個整數數組 nums,每個元素表示某一間房屋中的金額。相鄰的房屋不能被同時偷盜,問最多可以偷多少錢


? 解題思路(DP 狀態定義與轉移)

1. 狀態定義:

設:

  • f0 表示「不偷當前這家時的最大收益」;
  • f1 表示「偷當前這家時的最大收益」。

隨著遍歷每一間房,我們動態更新這兩個變量。

2. 狀態轉移邏輯:

對于當前房屋金額 x

  • 如果我們它,就不能偷上一個:f1 = f0 + x
  • 如果我們不偷它,就保留上一個偷的最大值:f1 = max(f1, f0 + x)
  • 所以前一步狀態要滾動更新:先將 f0 = f1,然后用前一個 f0 + x 計算新的 f1

總結起來為:

f0, f1 = f1, max(f1, f0 + x)
3. 初始化:
  • 初始時 f0 = f1 = 0,表示沒偷任何房屋;
  • 隨著每個房間的遍歷進行動態更新。
4. 最終返回結果:
  • f1 就是最終的最大收益(在遍歷結束后,無論最后一間偷還是不偷都已被計算)。

二、算法核心點

? 核心思想:動態規劃 + 狀態滾動

  • 對于每一間房子都有兩種選擇:偷或不偷
  • 關鍵是不能偷相鄰的兩家,因此形成狀態遞推結構;
  • 用兩個變量 f0f1 取代整個數組,進行滾動優化
class Solution:def rob(self, nums: List[int]) -> int:f0 = f1 = 0for x in nums:f0, f1 = f1, max(f1, f0 + x)return f1

三、復雜度分析

  • 時間復雜度:O(n)
    • 遍歷數組一遍。
  • 空間復雜度:O(1)
    • 只用了兩個變量(而不是數組),空間極致優化。

總結表

維度

內容

? 思路邏輯

每間房子選擇“偷”或“不偷”,根據前一個狀態遞推最大金額

? 核心技巧

動態規劃 + 狀態滾動優化(用 f0, f1 代替 dp 數組)

? 時間復雜度

O(n)

? 空間復雜度

O(1)


? 舉個例子說明

輸入:

nums = [2, 7, 9, 3, 1]

狀態變化:

初始: f0 = 0, f1 = 0
遍歷 2: f0 = 0, f1 = max(0, 0 + 2) = 2
遍歷 7: f0 = 2, f1 = max(2, 0 + 7) = 7
遍歷 9: f0 = 7, f1 = max(7, 2 + 9) = 11
遍歷 3: f0 = 11, f1 = max(11, 7 + 3) = 11
遍歷 1: f0 = 11, f1 = max(11, 11 + 1) = 12

最終返回 f1 = 12

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89145.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89145.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89145.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

電腦安裝 Win10 提示無法在當前分區上安裝Windows的解決辦法

原因: win10系統均添加快速啟動功能,預裝的win10電腦默認都是UEFI引導和GPT硬盤,傳統的引導方式為Legacy引導和MBR硬盤,UEFI必須跟GPT對應,同理Legacy必須跟MBR對應。如果BIOS開啟UEFI,而硬盤分區表格式為M…

大端序與小端序

理解大端序(Big-Endian)和小端序(Little-Endian)的關鍵在于數據在內存中存儲時字節的排列順序,特別是在存儲多字節數據類型(如整數、浮點數)時。以下是清晰易懂的解釋:核心概念 假設…

PyTorch筆記5----------Autograd、nn庫

1.Autograd grad和grad_fn grad:該tensor的梯度值,每次在計算backward時都需要將前一時刻的梯度歸零,否則梯度值會一直累加grad_fn:葉子結點通常為None,只有結果節點的grad_fn才有效,用于只是梯度函數時哪…

Perl 格式化輸出

Perl 格式化輸出 引言 Perl 是一種通用、解釋型、動態編程語言,廣泛應用于文本處理、系統管理、網絡編程等領域。在Perl編程中,格式化輸出是一種常見的需求,它可以幫助開發者更好地展示和打印信息。本文將詳細講解Perl中格式化輸出的方法&…

Python爬蟲實戰:研究markdown2庫相關技術

一、引言 1.1 研究背景與意義 在當今信息爆炸的時代,互聯網上的信息量呈指數級增長。如何高效地獲取和整理這些信息成為了一個重要的研究課題。網絡爬蟲作為一種自動獲取網頁內容的技術,能夠按照一定的規則,自動地抓取萬維網信息,為信息的收集提供了有力手段。 Markdown …

【Linux】基本指令詳解(二) 輸入\輸出重定向、一切皆文件、認識管道、man、cp、mv、echo、cat

文章目錄一、man指令二、輸入/輸出重定向(echo、一切皆文件)三、cp指令四、mv指令五、cat指令六、more/less指令七、head/tail指令八、管道初見一、man指令 Linux的指令有很多參數,我們不可能全記住,可以通過查看聯機手冊獲取幫助。 man 指令…

MVC HTML 幫助器

MVC HTML 幫助器 引言 MVC(模型-視圖-控制器)是一種流行的軟件架構模式,它將應用程序的邏輯分解為三個主要組件:模型(Model)、視圖(View)和控制器(Controller&#xff09…

linux下手工安裝ollama0.9.6

1、去下載ollama的linux版的壓縮包: 地址:https://github.com/ollama/ollama/releases2、上傳到linux中。3、解壓: tar zxvf ollama-linux-amd64-0.9.6.tgz -C /usr/local/4、如果僅僅是要手工執行,已經可以了: ollama…

kotlin布局交互

將 wrapContentSize() 方法鏈接到 Modifier 對象,然后傳遞 Alignment.Center 作為實參以將組件居中。Alignment.Center 會指定組件同時在水平和垂直方向上居中。 DiceWithButtonAndImage(modifier Modifier.fillMaxSize().wrapContentSize(Alignment.Center) )創建…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | ToastNotification(推送通知)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— ToastNotification組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API&#xff08;<script s…

學習筆記(34):matplotlib繪制圖表-房價數據分析與可視化

學習筆記(34):matplotlib繪制圖表-房價數據分析與可視化分析房價分布情況&#xff0c;通過直方圖、核密度估計和正態分布擬合來直觀展示房價的分布特征&#xff0c;并進行統計檢驗。一、房價數據分析與可視化&#xff0c;代碼分析1.1、導入必要的庫import pandas as pd import …

前端三劍客之CSS

1. CSS 簡介1) CSS 簡述CSS&#xff0c;即層疊樣式表&#xff08;英文全稱&#xff1a;Cascading Style Sheets&#xff09;&#xff0c;是一種專門用于修飾 HTML 文檔呈現樣式的計算機語言。它的功能不僅限于靜態美化網頁&#xff0c;還能與各類腳本語言配合&#xff0c;實現對…

力扣25.7.11每日一題——無需開會的工作日

Description 這題類似合并區間&#xff0c;題意你們都能看懂吧…… Solution 這道題就需要用到合并區間的方法。 答案等于 daysdaysdays 減「有會議安排的天數」。 對左端點進行排序&#xff0c;計算有會議安排的天數&#xff0c;累加每個區間的長度&#xff0c;即為有會議…

每日一SQL 【銷售分析 III】

文章目錄問題案例執行順序使用分組解決問題 案例 執行順序 SQL 語句的執行順序&#xff08;核心步驟&#xff09; 同一層級的select查詢內部, 別名在整個 SELECT 計算完成前不生效 使用分組解決 select distinct s.product_id, Product.product_name from Sales sleft join …

輕輕松松帶你進行-負載均衡LVS實戰

8. LVS部署命令介紹 8.1 LVS軟件相關信息 1.程序包&#xff1a;ipvsadm 2.Unit File: ipvsadm.service 3.主程序&#xff1a;/usr/sbin/ipvsadm 4.規則保存工具&#xff1a;/usr/sbin/ipvsadm-save 5.規則重載工具&#xff1a;/usr/sbin/ipvsadm-restore 6.配置文件&#xff1a…

C#.NET 集合框架詳解

簡介 C# 集合框架是處理數據集合的核心組件&#xff0c;位于 System.Collections 和 System.Collections.Generic 命名空間。它提供了多種數據結構來高效存儲和操作數據。 集合框架概覽 System.Collections (非泛型老版) └─ System.Collections.Generic (泛…

網絡劫持對用戶隱私安全的影響:一場無形的數據竊取危機

在互聯網時代&#xff0c;網絡劫持如同一把“隱形鐮刀”&#xff0c;悄然威脅著用戶的隱私安全。當我們在瀏覽網頁、使用社交媒體或進行在線交易時&#xff0c;看似正常的網絡連接背后&#xff0c;可能正暗藏著數據被竊取的風險。網絡劫持通過多種技術手段干預用戶與服務器的正…

使用 Helm 下載 Milvus 安裝包(Chart)指南

目錄 &#x1f4e6; 使用 Helm 下載 Milvus 安裝包&#xff08;Chart&#xff09;指南 &#x1f6e0; 環境準備 &#x1f680; 第一步&#xff1a;添加 Milvus Helm 倉庫 &#x1f50d; 第二步&#xff1a;查看可用版本 &#x1f4e5; 第三步&#xff1a;下載指定版本的 C…

EXTI 外部中斷

目錄 STM32中斷 NVIC 中斷控制器 NVIC優先級分組 EXTI 外部中斷 AFIO 復用IO口 外部中斷/事件控制器&#xff08;EXTI&#xff09;框圖 STM32中斷 在STM32微控制器中&#xff0c;共有68個可屏蔽中斷通道&#xff0c;涵蓋了多個外設&#xff0c;如外部中斷&#xff08;EXT…

WebApplicationType.REACTIVE 的webSocket

通用請求體類 Data ApiModel("websocket請求消息") public class WebSocketRequest<T> implements Serializable {private static final long serialVersionUID 1L;/*** 參考&#xff1a;com.mcmcnet.gacne.basic.service.common.pojo.enumeration.screen.AiB…