給定乙個二叉樹,我們在樹的節點上安裝攝像頭。
節點上的每個攝影頭都可以監視其父物件、自身及其直接子物件。
計算監控樹的所有節點所需的最小攝像頭數量。
首先要表示節點的狀態flag:沒有被覆蓋:0,被覆蓋:1,裝了攝像頭:2。
可以用遞迴的形式,也可以根據貪心,看兩個字節點的情況。
class
solution
:def
mincameracover
(self, root: treenode)
->
int:
@lru_cache(
none
)def
dfs(root, flag)
:### flag表示當前節點的狀態
ifnot root:
return
1if flag ==
2else
0 left, right = root.left, root.right
f0 =
1+ dfs(left,1)
+ dfs(right,1)
if flag ==2:
### 當前節點裝監視器,那麼他的子節點都被覆蓋
return f0
if flag ==0:
### 當前節點沒有被覆蓋,可以裝監視器,也可以讓子節點裝監視器來被覆蓋
return
min(
[dfs(left,2)
+ dfs(right,0)
, dfs(left,0)
+ dfs(right,2)
, f0]
)if flag ==1:
### 當前節點已經被覆蓋,可以裝監視器,如果當前不裝,那麼他的子節點都沒有被覆蓋
return
min(dfs(left,0)
+ dfs(right,0)
, f0)
return dfs(root,
0)
class
solution
:def
mincameracover
(self, root: treenode)
->
int:
self.res =
0def
dfs(root):if
not root:
return
1 left = dfs(root.left)
right = dfs(root.right)
if left ==
1and right ==1:
return
0if left ==
0or right ==0:
self.res +=
1return
2if left + right >=3:
return
1 m = dfs(root)
if m ==0:
self.res +=
1return self.res
Leetcode千題 1 兩數之和
給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9...
兩數之和(LeetCode題)
問題描述 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 ...
LeetCode演算法題 兩數相除
給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數 dividend 除以除數 divisor 得到的商。示例 1 輸入 dividend 10,divisor 3 輸出 3 示例 2 輸入 dividend 7,divis...