↓快轉到主要內容
  1. LeetCode/

LeetCode 3840: House Robber V

·1 分鐘· ·
LeetCode Medium Dynamic-Programming Array
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2026-02-14

  • 提交紀錄:Accepted(一次通過)

解題思路
#

dp[i] = 前 i 間房子能拿的最大金額。看第 i 間(0-indexed):

  • 跟前一間顏色不同:拿它不會跟任何人衝突,而且金額都是正的,直接拿:dp[i + 1] = dp[i] + nums[i]。
  • 跟前一間顏色相同:就是原本的打家劫舍,拿它就不能拿前一間:dp[i + 1] = max(dp[i], dp[i - 1] + nums[i])。

我的解法
#

class Solution:
    def rob(self, nums: List[int], colors: List[int]) -> int:
        n = len(nums)
        dp = [0] * (n + 1)                         # dp[i]:前 i 間的最大金額
        for i in range(n):
            if i > 0 and colors[i] == colors[i - 1]:
                dp[i + 1] = max(dp[i], dp[i - 1] + nums[i])
            else:
                dp[i + 1] = dp[i] + nums[i]        # 不會衝突,直接拿
        return dp[n]

複雜度
#

時間 O(n),空間 O(n)(可以壓成兩個變數)。

要特別避免的錯誤
#

  • 把它當成一般的打家劫舍:顏色不同的相鄰房子可以一起拿。

面試口說整理
#

dp[i] 是前 i 間的最大金額。如果這間跟前一間顏色不同,拿它不會衝突,金額又是正的,就直接加上去;顏色相同時才是打家劫舍,在「不拿這間」和「拿這間但跳過前一間」之間取最大值。時間 O(n)。

相關文章

LeetCode 1493: Longest Subarray of 1's After Deleting One Element
·1 分鐘
LeetCode Medium Sliding-Window Dynamic-Programming Array
LeetCode 1493 解題筆記:找「最多 1 個 0」的最長視窗,因為一定要刪一個元素,答案是視窗長度減 1
LeetCode 3638: Maximum Balanced Shipments
·1 分鐘
LeetCode Medium Dynamic-Programming Greedy Monotonic-Stack Array
LeetCode 3638 解題筆記:貪心,一段一旦出現比這段最大值小的數就馬上切;因為切之前的那段是非遞減的,最大值就是前一個數
LeetCode 313: Super Ugly Number
·1 分鐘
LeetCode Medium Array Math Dynamic-Programming
LeetCode 313 解題筆記:LC 264 的推廣,每個質數一個指針;用 heap 的話要避免同一個數被推進去很多次
LeetCode 396: Rotate Function
·1 分鐘
LeetCode Medium Array Math Dynamic-Programming
LeetCode 396 解題筆記:F(k) 和 F(k - 1) 只差一個公式:F(k) = F(k - 1) + sum - n × 被移到最前面的那個數
LeetCode 435: Non-overlapping Intervals
·1 分鐘
LeetCode Medium Array Dynamic-Programming Greedy Sorting
LeetCode 435 解題筆記:最少刪幾個 = 總數減掉最多能保留幾個;按右端點排序,貪心保留結束最早的
LeetCode 473: Matchsticks to Square
·1 分鐘
LeetCode Medium Array Dynamic-Programming Backtracking Bit-Manipulation
LeetCode 473 解題筆記:總和要能被 4 整除;由大到小把每根火柴放進四個邊之一,超過邊長或跟前一個邊長度相同就跳過