dp[i]陣列的含義是偷前i-1個房子,不包括i-1。所以需要n+1個,表示偷前n個房子
所以遞迴方程為dp[i]=math.max(dp[i-1],dp[i-2]+nums[i-1])
對於第i-1個,有兩種可能,不偷第i-1個,就是dp[i-1]。偷i-1,那麼i-2就不能偷,所以是dp[i-2]+nums[i-1]
class
solution
return dp[n];}
}
因為dp只和dp[i-1]和dp[i-2]有關,所以可以對dp進行優化
class
solution
return b;
}}
本題的提公升之處在於,房屋的首尾連線成環。首尾不能同時選,所以從0到n-1計算一次,從1到n計算一次,求出兩個的最大值。相當於使用兩次打家劫舍的演算法
class
solution
a=0;
b=0;
for(
int i=
1;i)return math.
max(temp1,temp2);}
}
根據根節點是否選取,可以分為兩種進行遞迴。遞迴思想(不要深入遞迴函式體,只需知道遞迴函式的功能,以及找到跳出遞迴的邊界條件)
思路:能盜取的最高金額為 搶劫該節點+搶劫該節點的左孩子的左右子樹+搶劫該節點的右孩子的左右子樹與 搶劫該節點的左子樹+搶劫該節點的右子樹的和 的最大值但是遞迴出現很大重複計算,速度很慢。
/**
* definition for a binary tree node.
* public class treenode
* }*/class
solution
}
動態規劃
思路:定義乙個陣列ans,長度為2,ans[0]表示不搶該節點可獲得最大值,ans[1]表示搶劫該節點可獲得最大值方法helper®意為:在以r為根節點的樹中,返回搶劫根節點與不搶劫根節點可獲得的最大值
/**
* definition for a binary tree node.
* public class treenode
* }*/class
solution
public
int[
]helper
(treenode root)
}
打家劫舍系列DP之打家劫舍II
你是乙個專業的小偷,計畫偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味著第乙個房屋和最後乙個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝...
LeetCode 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
leetcode 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...