力扣213 打家劫舍 II

2022-03-26 11:17:16 字數 1521 閱讀 9723

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

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

示例 1:

輸入: [2,3,2]

輸出: 3

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

示例 2:

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

輸出: 4

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

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

原題url:

這道題的變化是,同樣是乙個陣列,但是首尾相連了,也就是成了乙個環,那麼原本遞推的方式也就行不通了,因為任何乙個節點其實地位都相等了,也就找不到最初的狀態,無法進行遞推了。

但我們可以將現在的問題轉化成我們已經解決的問題,仔細想想。所謂的首尾相連,針對狀態進行劃分,可以有三種情況:

首尾節點都不選擇

只選擇首節點,不選擇尾結點

只選擇尾結點,不選擇首節點

因為我們最終是要求出最大值,那麼只需要考慮後面兩種情況,而這樣的話,又可以轉化成了原本的線性陣列了。

接下來讓我們看看**:

class solution 

if (nums.length == 1)

// 因為收尾相連,無法按照最初的動態規劃來做,因為沒有乙個可以開始的點。

// 那麼就將未知問題轉化為已知問題,針對首尾兩個節點,可以有三種情況:

// 1、首尾節點都不選擇

// 2、只選擇首節點,不選擇尾結點

// 3、只選擇尾結點,不選擇首節點

// 因為是要取最大值,且是非負整數資料,所以只考慮後兩種情況

return math.max(

// 只選擇首節點,不選擇尾結點

calmax(nums, 0, nums.length - 2),

// 只選擇尾結點,不選擇首節點

calmax(nums, 1, nums.length - 1));}

public int calmax(int nums, int start, int end)

return current;}}

提交ok。

以上就是這道題目我的解答過程了,不知道大家是否理解了。這道題主要還是利用動態規劃,只是需要大家進行思路轉化,將未知轉化為 已知,從而解決問題。

力扣213 打家劫舍 II(動態規劃)

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

213 打家劫舍 II

題目描述提示幫助提交記錄社群討論閱讀解答 你是乙個專業的小偷,計畫偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味著第乙個房屋和最後乙個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存...

213 打家劫舍 II

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