代碼隨想錄Day 41|Leetcode|Python|198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

198.打家劫舍

你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警

給定一個代表每個房屋存放金額的非負整數數組,計算你?不觸動警報裝置的情況下?,一夜之內能夠偷竊到的最高金額。

解題思路:

確定dp數組含義:dp[i]遍歷到房屋index為i時所能打劫到的最多錢

確認遞推公式:dp[i]取決于前一個房屋和前兩個房屋是否有被偷,如果前一個被偷,則不能偷第i個,如果第i-2個被偷,可選擇是否偷第i個。dp[i] = max(dp[i-2]+nums[i], dp[i-1])

初始化:dp[0] = nums[0], dp[1] = max(nums[0], nums[1])

遍歷順序:從小到大遍歷

打印dp數組

class Solution:def rob(self, nums: List[int]) -> int:if len(nums)<=1:return nums[0]dp = [0]*(len(nums))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[len(nums)-1]

?213.打家劫舍II

你是一個專業的小偷,計劃偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都?圍成一圈?,這意味著第一個房屋和最后一個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警?。

給定一個代表每個房屋存放金額的非負整數數組,計算你?在不觸動警報裝置的情況下?,今晚能夠偷竊到的最高金額。

解題思路:

本題與上一題區別在于環形數組和直線數組,環形數組首尾不能同時取值,因此分為三種情況:

  1. 不考慮首尾的數組
  2. 不考慮尾部的數組
  3. 不考慮首部的數組

可以發現2, 3包含情況一,因此只需要在2,3中取最大值即可。

dp五步驟:

確定dp數組含義:dp[i]遍歷到房屋index為i時所能打劫到的最多錢

確認遞推公式:dp[i]取決于前一個房屋和前兩個房屋是否有被偷,如果前一個被偷,則不能偷第i個,如果第i-2個被偷,可選擇是否偷第i個。dp[i] = max(dp[i-2]+nums[i], dp[i-1])

初始化:dp[0] = nums[0], dp[1] = max(nums[0], nums[1])

遍歷順序:從小到大遍歷

打印dp數組

class Solution:def rob(self, nums: List[int]) -> int:if len(nums)<=1:return nums[0]def helper(subnums):if len(subnums)<=1:return subnums[0]dp = [0]*len(subnums)dp[0] = subnums[0]dp[1] = max(subnums[0], subnums[1])for i in range(2, len(subnums)):dp[i] = max(dp[i-2]+subnums[i], dp[i-1])print(dp)return dp[len(subnums)-1]return max(helper(nums[:-1]), helper(nums[1:]))

?337.打家劫舍III

小偷又發現了一個新的可行竊的地區。這個地區只有一個入口,我們稱之為?root?。

除了?root?之外,每棟房子有且只有一個“父“房子與之相連。一番偵察之后,聰明的小偷意識到“這個地方的所有房屋的排列類似于一棵二叉樹”。 如果?兩個直接相連的房子在同一天晚上被打劫?,房屋將自動報警。

給定二叉樹的?root?。返回?在不觸動警報的情況下?,小偷能夠盜取的最高金額?。

示例 1:

輸入: root = [3,2,3,null,3,null,1]
輸出: 7 
解釋:?小偷一晚能夠盜取的最高金額 3 + 3 + 1 = 7

解題思路:

本體使用遞歸三部曲結合dp五步驟,設置dp[0],dp[1]表示打劫當前節點和不打劫當前節點的最大值,每個node有一組對應的dp[0], dp[1]。使用后序遍歷,當前節點dp值需要結合其左右節點dp進行分析。?遞歸三步驟:確定遞歸參數,確定停止條件,遞歸邏輯。輸入參數統一為當前節點即表示為root, 當root == null停止并返回0,再遍歷左右子樹,中間值取最大dp值。

重點理解

val1 = root.val + leftdp[0] + rightdp[0]#行竊root

val2 = max(leftdp[0],leftdp[1])+max(rightdp[0], rightdp[1])#不行竊root,選取左右子樹行竊或不行竊時的最大值,兩邊取max。

代碼如下:

# 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:def helper(root):if not root:return [0,0]leftdp = helper(root.left)rightdp = helper(root.right)val1 = root.val + leftdp[0] + rightdp[0]#行竊rootval2 = max(leftdp[0],leftdp[1])+max(rightdp[0], rightdp[1])#不行竊rootreturn [val2, val1]return max(helper(root))

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

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

相關文章

在統計上城鄉是如何劃分的

城鄉二元結構&#xff0c;是長期以來我國經濟社會發展的顯著特點之一&#xff0c;黨和政府高度重視統籌城鄉發展&#xff0c;縮小城鄉差距。為了對城鄉發展予以準確反映和動態監測&#xff0c;提高在統計上劃分城鄉工作的一致性&#xff0c;國家統計局開展了統一的統計用區劃代…

【Docker學習】docker run的端口映射-p和-P選項

docker run的端口映射選項分為-p&#xff08;小寫&#xff0c;全稱--publish&#xff09;&#xff0c;-P&#xff08;大寫&#xff0c;全稱--publish-all&#xff09;&#xff0c;之前認為只有改變容器發布給宿主機的默認端口號才會進行-p的設置&#xff0c;而不改變默認端口號…

面試經典算法系列之數組/字符串6 -- 輪轉數組

面試經典算法題38-輪轉數組 LeetCode.189 公眾號&#xff1a;阿Q技術站 問題描述 給定一個整數數組 nums&#xff0c;將數組中的元素向右輪轉 k 個位置&#xff0c;其中 k 是非負數。 示例 1: 輸入: nums [1,2,3,4,5,6,7], k 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右輪轉 1 …

YOLOv8訓練流程-原理解析[目標檢測理論篇]

關于YOLOv8的主干網絡在YOLOv8網絡結構介紹-CSDN博客介紹了&#xff0c;為了更好地學習本章內容&#xff0c;建議先去看預測流程的原理分析YOLOv8原理解析[目標檢測理論篇]-CSDN博客&#xff0c;再次把YOLOv8網絡結構圖放在這里&#xff0c;方便隨時查看。 ? 1.前言 YOLOv8訓練…

Map中KEY去除下劃線并首字母轉換為大寫工具類

在運維舊項目時候&#xff0c;碰上sql查詢結果只能返回List<Map>&#xff0c;key為表單字段名&#xff0c;value為獲取到的結果數據。 懶得一個一個敲出來&#xff0c;就直接寫個方法轉換&#xff0c;并賦值到相應實體對象里去。 Map中KEY去除下劃線并首字母轉換為大寫&…

算法提高之矩陣距離

算法提高之矩陣距離 核心思想&#xff1a;多源bfs 從多個源頭做bfs&#xff0c;求距離 先把所有1的坐標存入隊列 再把所有1連接的位置存入 一層一層求 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 1…

Kafka 面試題(八)

1. Kafka&#xff1a;硬件配置選擇和調優的建議 &#xff1f; Kafka的硬件配置選擇和調優是確保Kafka集群高效穩定運行的關鍵環節。以下是一些建議&#xff1a; 硬件配置選擇&#xff1a; 內存&#xff08;RAM&#xff09;&#xff1a;建議至少使用32GB內存的服務器。為Kafk…

Web3Tools - 助記詞生成

Web3Tools - 助記詞生成工具 本文介紹了一個簡單的助記詞生成工具&#xff0c;使用 React 和 Material-UI 構建。用戶可以選擇助記詞的語言和長度&#xff0c;然后生成隨機的助記詞并顯示在頁面上 功能介紹 選擇語言和長度&#xff1a; 用戶可以在下拉菜單中選擇助記詞的語言&…

uniapp 圖片添加水印代碼封裝(優化版、圖片上傳壓縮、生成文字根據頁面自適應比例、增加文字背景色

uniapp 圖片添加水印代碼封裝(優化版、圖片上傳壓縮、生成文字根據頁面自適應比例、增加文字背景色 多張照片上傳封裝 <template><view class"image-picker"><uni-file-picker v-model"imageValue" :auto-upload"false" :title…

關于服務端接口知識的匯總

大家好&#xff0c;今天給大家分享一下之前整理的關于接口知識的匯總&#xff0c;對于測試人員來說&#xff0c;深入了解接口知識能帶來諸多顯著的好處。 一、為什么要了解接口知識&#xff1f; 接口是系統不同模塊之間交互的關鍵通道。只有充分掌握接口知識&#xff0c;才能…

http-server實現本地服務器

要實現一個本地服務器&#xff0c;你可以使用Node.js的http-server模塊。首先&#xff0c;確保你已經安裝了Node.js和npm。然后&#xff0c;按照以下步驟操作&#xff1a; 打開終端或命令提示符&#xff0c;進入你想要作為服務器根目錄的文件夾&#xff1b;運行以下命令安裝ht…

Axure PR 10 制作頂部下拉三級菜單和側邊三級菜單教程和源碼

在線預覽地址&#xff1a;Untitled Document 2.側邊三級下拉菜單 在線預覽地址&#xff1a;Untitled Document 文件包和教程下載地址&#xff1a;https://pan.quark.cn/s/77e55945bfa4 程序員必備資源網站&#xff1a;天夢星服務平臺 (tmxkj.top)

Linux x86_64 dump_stack()函數基于FP棧回溯

文章目錄 前言一、dump_stack函數使用二、dump_stack函數源碼解析2.1 show_stack2.2 show_stack_log_lvl2.3 show_trace_log_lvl2.4 dump_trace2.5 print_context_stack 參考資料 前言 Linux x86_64 centos7 Linux&#xff1a;3.10.0 一、dump_stack函數使用 dump_stack函數…

Unity開發中導彈路徑散射的原理與實現

Unity開發中導彈路徑散射的原理與實現 前言邏輯原理代碼實現導彈自身腳本外部控制腳本 應用效果結語 前言 前面我們學習了導彈的追蹤的效果&#xff0c;但是在動畫或游戲中&#xff0c;我們經常可以看到導彈發射后的彈道是不規則的&#xff0c;扭扭曲曲的飛行&#xff0c;然后擊…

數字生態系統的演進與企業API管理的關鍵之路

數字生態系統的演進與企業API管理的關鍵之路 在數字化時代&#xff0c;企業正經歷著一場轉型的浪潮&#xff0c;而API&#xff08;應用程序編程接口&#xff09;扮演著至關重要的角色。API如同一座橋梁&#xff0c;將組織內部的價值轉化為可市場化的產品&#xff0c;從而增強企…

韓國站群服務器在全球網絡架構中的重要作用?

韓國站群服務器在全球網絡架構中的重要作用? 在全球互聯網的蓬勃發展中&#xff0c;站群服務器作為網絡架構的核心組成部分之一&#xff0c;扮演著至關重要的角色。韓國站群服務器以其卓越的技術實力、優越的地理位置、穩定的網絡基礎設施和強大的安全保障能力&#xff0c;成…

LeetCode 題目 118:楊輝三角

題目描述 給定一個非負整數 numRows&#xff0c;生成楊輝三角的前 numRows 行。在楊輝三角中&#xff0c;每個數是它左上方和右上方的數的和。 楊輝三角解析 在這個詳解中&#xff0c;我們將使用 ASCII 圖形來說明楊輝三角的構建過程&#xff0c;包括逐行添加新的行的過程。…

250 基于matlab的5種時頻分析方法((短時傅里葉變換)STFT

基于matlab的5種時頻分析方法&#xff08;(短時傅里葉變換)STFT,Gabor展開和小波變換,Wigner-Ville&#xff08;WVD&#xff09;,偽Wigner-Ville分布(PWVD),平滑偽Wigner-Ville分布&#xff08;SPWVD&#xff09;,每條程序都有詳細的說明&#xff0c;設置仿真信號進行時頻輸出。…

Parted分區大容量磁盤

創建了新的虛擬磁盤10T , 掛載后分區格式化一.fdisk無法創建大容量的分區 Fileserver:~ # fdisk /dev/sdb Welcome to fdisk (util-linux 2.29.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device …

使用html和css實現個人簡歷表單的制作

根據下列要求&#xff0c;做出下圖所示的個人簡歷&#xff08;表單&#xff09; 表單要求 Ⅰ、表格整體的邊框為1像素&#xff0c;單元格間距為0&#xff0c;表格中前六列列寬均為100像素&#xff0c;第七列 為200像素&#xff0c;表格整體在頁面上居中顯示&#xff1b; Ⅱ、前…