1 回答

TA貢獻1725條經驗 獲得超8個贊
理解該算法的一種方法是考慮循環(huán)不變量。在這種情況下, 的數組nodes
始終滿足在每次執(zhí)行 之前和之后的條件for-loop
:
nodes
為空且最大二叉樹不存在(例如,如果輸入nums
為空)中的第一項
nodes
是基于迄今為止從輸入處理的數據的最大二叉樹nums
確保while-loop
當前最大二叉樹是數組中的第一項nodes
,否則,它將被彈出并添加為left
子樹。
在 的每次迭代期間for-loop
,檢查:
if nodes: nodes[-1].right = node
將當前節(jié)點作為右子樹添加到數組中的最后一項nodes
。當發(fā)生這種情況時,當前節(jié)點小于數組中的最后一個節(jié)點nodes
(因為每個輸入整數被定義為唯一)。并且由于當前節(jié)點小于數組中的最后一個節(jié)點,因此最后一個節(jié)點充當其值大于當前項的分區(qū)點,這就是為什么將當前節(jié)點添加為右子樹。
當數組中有多個項目時nodes
,每個項目都是其左側項目的子樹。
運行時間
對于運行時間,令n為輸入的長度nums
。for 循環(huán)執(zhí)行了n次。如果輸入數據按降序排序,但最大輸入值位于輸入末尾(例如:4、3、2、1、5),則每次迭代期間將跳過內部 while 循環(huán),直到最后一次 for 循環(huán)迭代。在最后一次 for 循環(huán)迭代期間, while 循環(huán)將運行n - 1次,總運行時間為n + (n - 1) => 2n - 1 => O(n)。
添加回答
舉報