198. House Robber
題目網址:https://leetcode.cn/problems/house-robber/
題意:你是一名專業的強盜, 計劃搶劫沿路的房子。每棟房子都藏有一定數量的金錢, 唯一阻止你搶劫的限制是相鄰的房子都連接了安全系統, 如果闖入兩棟相鄰的房子,它會自動報警。
給一整數 array
nums, 表示每棟房子所藏有的金額, 返回在不報警的情況下能搶劫的最大金額。

Solution 1:
想法:利用 DP, 其中
dp[i]代表 index 位於區間[0, i]這i + 1間房子中可搶劫的最大金額。接著,我們考慮單一一間房子的情況,對於index = i的房子我們有兩種選擇,要搶 or 不搶
- 若
index = i的房子不搶, 此時的最大金額 = 區間[0, i - 1]的最大金額 =dp[i - 1]- 若
index = i的房子要搶, 此時的最大金額 = 區間[0, i - 2]的最大金額 +index = i的金額 =dp[i - 2] + nums[i]➔ 因此
dp[i]就為這兩種可能中取較大者,dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])此外,由於我們的 index 是從
0開始取的,因此要考慮dp[i - 1]、dp[i - 2]越界的情況, 根據dp[i]的定義,dp[-1]代表在nums中的 index 區間[0, -1]可搶劫的最大金額,但nums中 index 區間[0, -1]中根本沒有任何數,所以可搶劫的最大金額可視為0。所以一旦要存取的 index 越界我們就取0。
class Solution { |
- time:$O(n)$ ➔ for loop
- space:$O(n)$ ➔
dp
Solution 2:
想法:Solution 1 的改進, 計算
dp[i]只需用到dp[i - 1]和dp[i - 2], 不需要開到n個空間
class Solution { |
- time:$O(n)$ ➔ for loop
- space:$O(1)$ ➔ 只需常數空間
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論