leetcode 337 打家劫舍(3)

2021-10-08 21:42:42 字數 1290 閱讀 5854

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

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

示例 1:

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

3

/ \

23 \ \ 31

輸出: 7

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

示例 2:

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

3

/ \ 4

5/ \ \ 13

1

輸出: 9

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

踩掉的坑:

這個問題並不是分層對二叉樹求和,例如:求奇數層的和與偶數層的和比較大小,返回較大的值並不是問題的解。

2

/ \13 \

4

是否將當前節點納入rob的範圍中時,當前節點和當前節點的左右子節點的大小和或者左右子節點的遞迴和進行比較。這個是編碼時候出現的坑,要明確動態規劃比較的物件。

解題思路:

public

introb

(treenode root)

當前節點是否能被納入範圍需要比較

a=當前節點+rob(左子節點的兩個子節點)+rob(右子節點的兩個子節點)

b=rob(當前節點的左右子節點)

需要比較a,b才能知道當前節點是否需要納入範圍。

public

introb

(treenode root)

if(root.right!=null)

b=rob(root.left)

+rob

(root.right);if

(a>b)

else

}

結果如下

**評價:大多數都是差不多的空間複雜度,如果要優化時間複雜度應該需要更好的設計,在這個演算法中有大量節點會被重複計算rob()。

LeetCode337 打家劫舍

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

leetcode337打家劫舍III

不搶劫該節點,則可以搶劫該節點的左右字節點 注意,node節點不搶不意味著一定要搶它的左右子結點,所以在方法中應該呼叫rob方法,而不是robinclude方法 public int robexclude treenode node return rob node.left rob node.rig...

Leetcode 337 打家劫舍 III

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