LeetCode 打家劫舍問題

2022-06-24 09:18:20 字數 2939 閱讀 8438

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

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

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

a:典型的動態規劃問題。

當前房子分成兩種可能,要麼搶了,要麼沒搶。

如果當前搶了,要麼是上一次沒搶,要麼是上上次搶了;

如果當前沒搶,要麼是上次搶了,要麼是上上次搶了(為了能讓下次搶,這次先不搶);

這樣,dp就很好寫了:

dp[i][0] = math.max(dp[i - 1][1], dp[i - 2][1]);//要麼是上次搶了,要麼是上上次搶了

dp[i][1] = math.max(dp[i - 1][0] + nums[i], dp[i - 2][1] + nums[i]);//要麼是上一次沒搶,要麼是上上次搶了

**:

public static int rob(int nums) 

return math.max(dp[nums.length - 1][0], dp[nums.length - 1][1]);

}

或者,從尾走到頭:(引用自《labuladong的演算法小抄》)

// 返回 nums[start..] 能搶到的最⼤值

private int dp(int nums, int start)

int res = math.max(

// 不搶,去下家

dp(nums, start + 1),

// 搶,去下下家

nums[start] + dp(nums, start + 2)

);return res;

}

這也可以新增memo防止重複計算。

這是自頂向下的,也可以自底向上,減少計算

int rob(int nums) 

return dp[0];

}

因為只和dp[i + 1],dp[i + 2]相關,可以只用兩個變數記錄一下。

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

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

示例 1:

輸入: [2,3,2]

輸出: 3

解釋: 你不能先偷竊 1 號房屋(金額 = 2),然後偷竊 3 號房屋(金額 = 2), 因為他們是相鄰的。

示例 2:

輸入: [1,2,3,1]

輸出: 4

解釋: 你可以先偷竊 1 號房屋(金額 = 1),然後偷竊 3 號房屋(金額 = 3)。

偷竊到的最高金額 = 1 + 3 = 4 。

a:⾸先,⾸尾房間不能同時被搶,那麼只可能有三種不同情況:要麼都不被搶;要麼第⼀間房⼦被搶最後⼀間不搶;要麼最後⼀間房⼦被搶第⼀間不搶。

那就簡單了啊,這三種情況,那種的結果最⼤,就是最終答案唄!不過,其實我們不需要⽐較三種情況,只要⽐較情況⼆和情況三就⾏了,因為這兩種情況對於房⼦的選擇餘地⽐情況⼀⼤呀,房⼦⾥的錢數都是⾮負數,所以選擇餘地⼤,最優決策結果肯定不會⼩。帶入上面的就可以了。

public static int rob(int nums) 

private static int maxrob(int nums, int start, int end)

return dp;

}

q:在上次打劫完一條街道之後和一圈房屋後,小偷又發現了乙個新的可行竊的地區。這個地區只有乙個入口,我們稱之為「根」。 除了「根」之外,每棟房子有且只有乙個「父「房子與之相連。一番偵察之後,聰明的小偷意識到「這個地方的所有房屋的排列類似於一棵二叉樹」。 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自動報警。

計算在不觸動警報的情況下,小偷一晚能夠盜取的最高金額。

示例 1:

輸入: [3,2,3,null,3,null,1]3/

2 3

\ \

3 1

輸出: 7

解釋: 小偷一晚能夠盜取的最高金額 = 3 + 3 + 1 = 7.

示例 2:

輸入: [3,4,5,1,3,null,1]3/

4 5

/ \ \

1 3 1

輸出: 9

解釋: 小偷一晚能夠盜取的最高金額 = 4 + 5 = 9.

a:看到樹,就遞迴。

mapmap = new hashmap<>();

public int rob(treenode root)

leetcode 打家劫舍問題

題目 你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。分析 dp ...

LeetCode打家劫舍問題

打家劫舍i 簡單的dp 設定兩個陣列 f i 代表必偷第i個,g i 代表不偷第i個 class solution return max f n g n 打家劫舍ii 這裡跟第一題最大的區別在於第一家跟第n家不能同時偷 要麼偷1不偷n 要麼偷n不偷n 要麼都不偷 所以分類討論 第一種不選第一家 f ...

打家劫舍問題 LeetCode198 213

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...