Leetcode 打家劫舍II(中等)動態規劃

2021-10-04 10:02:47 字數 1149 閱讀 3174

題目描述:

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

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

示例 1:

輸入: [2,3,2]

輸出: 3

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

示例 2:

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

輸出: 4

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

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

此題與198.打家劫舍(不同的地方是房子是環狀排列的,這也正是此題的難度所在。因為第乙個房間和最後乙個房間會相互影響,即如果偷了第一間,則最後一間不能再偷。

我們可以將環狀排列房間簡化為 兩個單排排列的房間子問題,此時就和198題一樣了:

具體的狀態轉移方程可以檢視上面的鏈結,過程很詳細。

(1)在不偷第一間房子的情況下,最大金額為m1;

(2)在不偷最後一間房子的情況下,最大金額為m2;

最後所求的最大金額則是max(m1,m2)。

class solution

vectordp(len+1);

//假設不偷第一家

dp[0] = 0;

dp[1] = 0;

dp[2] = nums[1];

for(int i=3; i<=len; ++i)

int m1 = dp[len];

//假設不偷最後一家

dp[0] = 0;

dp[1] = nums[0];

for(int i=2; i也可以考慮寫乙個函式,呼叫兩次分別計算0-(len-1) 和 1-(len) 的最大值。

空間複雜度也是可以進一步優化,使用cur 和 pre 記錄前兩個最大值即可。

打家劫舍II

你是乙個專業的小偷,計畫偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味著第乙個房屋和最後乙個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝...

打家劫舍 II

相較於打家劫舍,算是乙個公升級版。既然是打家劫舍的公升級版,那我們就先找與原版之間的聯絡。做過打家劫舍之後我們知道狀態轉移方程是dp i max dp i 1 dp i 2 nums i 1 然後我們再來看這道題,由相鄰的一家變成了相鄰的兩家。那麼就相當於把原來的一條直線首尾相連變成了乙個環,這句話...

打家劫舍II

你是乙個專業的小偷,計畫偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味著第乙個房屋和最後乙個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝...