日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

968. Binary Tree Cameras 监控二叉树

發(fā)布時間:2024/5/17 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 968. Binary Tree Cameras 监控二叉树 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

給定一個二叉樹,我們在樹的節(jié)點(diǎn)上安裝攝像頭。

節(jié)點(diǎn)上的每個攝影頭都可以監(jiān)視其父對象、自身及其直接子對象。

計算監(jiān)控樹的所有節(jié)點(diǎn)所需的最小攝像頭數(shù)量。

?

示例 1:

輸入:[0,0,null,0,0] 輸出:1 解釋:如圖所示,一臺攝像頭足以監(jiān)控所有節(jié)點(diǎn)。

示例 2:

輸入:[0,0,null,0,null,0,null,null,0] 輸出:2 解釋:需要至少兩個攝像頭來監(jiān)視樹的所有節(jié)點(diǎn)。 上圖顯示了攝像頭放置的有效位置之一。


提示:

  • 給定樹的節(jié)點(diǎn)數(shù)的范圍是?[1, 1000]。
  • 每個節(jié)點(diǎn)的值都是 0。
  • 遞歸

    本題以二叉樹為背景,不難想到用遞歸的方式求解。本題的難度在于如何從左、右子樹的狀態(tài),推導(dǎo)出父節(jié)點(diǎn)的狀態(tài)。

    為了表述方便,我們約定:如果某棵樹的所有節(jié)點(diǎn)都被監(jiān)控,則稱該樹被「覆蓋」。

    假設(shè)當(dāng)前節(jié)點(diǎn)為 root\textit{root}root,其左右孩子為 left,right\textit{left}, \textit{right}left,right。如果要覆蓋以 root\textit{root}root 為根的樹,有兩種情況:

    • 若在 root\textit{root}root 處安放攝像頭,則孩子 left,right\textit{left}, \textit{right}left,right 一定也會被監(jiān)控到。此時,只需要保證 left\textit{left}left 的兩棵子樹被覆蓋,同時保證 right\textit{right}right 的兩棵子樹也被覆蓋即可。
    • 否則, 如果 root\textit{root}root 處不安放攝像頭,則除了覆蓋 root\textit{root}root 的兩棵子樹之外,孩子 left,right\textit{left}, \textit{right}left,right 之一必須要安裝攝像頭,從而保證 root\textit{root}root 會被監(jiān)控到。

    根據(jù)上面的討論,能夠分析出,對于每個節(jié)點(diǎn) root\textit{root}root ,需要維護(hù)三種類型的狀態(tài):

    • 狀態(tài) aaaroot\textit{root}root 必須放置攝像頭的情況下,覆蓋整棵樹需要的攝像頭數(shù)目。
    • 狀態(tài) bbb:覆蓋整棵樹需要的攝像頭數(shù)目,無論 root\textit{root}root 是否放置攝像頭。
    • 狀態(tài) ccc:覆蓋兩棵子樹需要的攝像頭數(shù)目,無論節(jié)點(diǎn) root\textit{root}root 本身是否被監(jiān)控到。

    根據(jù)它們的定義,一定有 a≥b≥ca \geq b \geq cabc

    對于節(jié)點(diǎn) root\textit{root}root 而言,設(shè)其左右孩子 left,right\textit{left}, \textit{right}left,right 對應(yīng)的狀態(tài)變量分別為 (la,lb,lc)(l_a,l_b,l_c)(la?,lb?,lc?) 以及 (ra,rb,rc)(r_a,r_b,r_c)(ra?,rb?,rc?)。根據(jù)一開始的討論,我們已經(jīng)得到了求解 a,ba,ba,b 的過程:

    • a=lc+rc+1a = l_c + r_c + 1a=lc?+rc?+1
    • b=min?(a,min?(la+rb,ra+lb))b = \min(a, \min(l_a + r_b, r_a + l_b))b=min(a,min(la?+rb?,ra?+lb?))

    對于 ccc 而言,要保證兩棵子樹被完全覆蓋,要么 root\textit{root}root 處放置一個攝像頭,需要的攝像頭數(shù)目為 aaa;要么 root\textit{root}root 處不放置攝像頭,此時兩棵子樹分別保證自己被覆蓋,需要的攝像頭數(shù)目為 lb+rbl_b + r_blb?+rb?

    需要額外注意的是,對于 root\textit{root}root 而言,如果其某個孩子為空,則不能通過在該孩子處放置攝像頭的方式,監(jiān)控到當(dāng)前節(jié)點(diǎn)。因此,該孩子對應(yīng)的變量 aaa 應(yīng)當(dāng)返回一個大整數(shù),用于標(biāo)識不可能的情形。

    最終,根節(jié)點(diǎn)的狀態(tài)變量 bbb 即為要求出的答案。

    代碼

    def minCameraCover(self, root: TreeNode) -> int:def dfs(root: TreeNode) -> List[int]:if not root:return [float('inf'), 0, 0]la, lb, lc = dfs(root.left)ra, rb, rc = dfs(root.right)a = lc + rc + 1b = min(a, la + rb, ra + lb)c = min(a, lb + rb)return [a, b, c]a, b, c = dfs(root)return b

    總結(jié)

    以上是生活随笔為你收集整理的968. Binary Tree Cameras 监控二叉树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。