你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定乙個代表每個房屋存放金額的非負整數陣列,計算你 不觸動警報裝置的情況下 ,一夜之內能夠偷竊到的最高金額。
case1:
輸入:[1,2,3,1]
輸出:4
解釋:偷竊 1 號房屋 (金額 = 1) ,然後偷竊 3 號房屋 (金額 = 3)。
偷竊到的最高金額 = 1 + 3 = 4 。
case2:
輸入:[2,7,9,3,1]
輸出:12
解釋:偷竊 1 號房屋 (金額 = 2), 偷竊 3 號房屋 (金額 = 9),接著偷竊 5 號房屋 (金額 = 1)。
偷竊到的最高金額 = 2 + 9 + 1 = 12 。
題目想表達的含義是給定乙個金額陣列,求出在不觸動警報裝置的前提下,一夜之間能獲得的最大金額。
觸動警報裝置也就是連續獲取陣列中的數字,這是典型的動態規劃問題,問題的關鍵是找出狀態轉移方程。
定義dp陣列,dp[n]表示n個房屋獲得的最大金額數。
當前房屋有兩種狀態,偷和不偷,如果偷當前房屋,那麼肯定不能偷num[n-1];也就是當前元素的前乙個因為不能連續偷啊,這種情況下dp[n]=dp[n-2]+nums[n];如果不偷,dp[n] = dp[n-1];那怎樣使獲得的金額最大呢?兩種狀態比較大小,取出較大的乙個即可。
所以狀態轉移方程:dp[i] = math.max(dp[i-2]+nums[i],dp[i-1])
;
最後返回dp[len-1]即可。
class
solution
int dp=
newint
[nums.length]
; dp[0]
= nums[0]
; dp[1]
= math.
max(nums[0]
,nums[1]
);for(
int i=
2;i)return dp[nums.length-1]
;}}
時間複雜度是o(n),空間複雜度是o(n); LeetCode 198 打家劫舍
題目 你是乙個專業的強盜,計畫搶劫沿街的房屋。每間房都藏有一定的現金,阻止你搶劫他們的唯一的制約因素就是相鄰的房屋有保安系統連線,如果兩間相鄰的房屋在同一晚上被闖入,它會自動聯絡 給定乙個代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒 的情況下搶劫的最高金額。思路 本題的大致意思就是求取乙個...
LeetCode198 打家劫舍
你是乙個專業的強盜,計畫搶劫沿街的房屋。每間房都藏有一定的現金,阻止你搶劫他們的唯一的制約因素就是相鄰的房屋有保安系統連線,如果兩間相鄰的房屋在同一晚上被闖入,它會自動聯絡 給定乙個代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒 的情況下搶劫的最高金額。簡單的動態規劃問題,題目意思是計算陣列...
LeetCode198 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...