陣列變樹練習

2021-07-27 05:57:24 字數 750 閱讀 9373

對於乙個沒有重複元素的整數陣列,請用其中元素構造一棵maxtree,maxtree定義為一棵二叉樹,其中的節點與陣列元素一一對應,同時對於maxtree的每棵子樹,它的根的元素值為子樹的最大值。現有一建樹方法,對於陣列中的每個元素,其在樹中的父親為陣列中它左邊比它大的第乙個數和右邊比它大的第乙個數中更小的乙個。若兩邊都不存在比它大的數,那麼它就是樹根。請設計o(n)的演算法實現這個方法。

給定乙個無重複元素的陣列a和它的大小n,請返回乙個陣列,其中每個元素為原陣列中對應位置元素在樹中的父親節點的編號,若為根則值為-1。

測試樣例:

[3,1,4,2],4

返回:[2,0,-1,2]

要求時間複雜度為o(n),題目中已經有提示了,其實和最大最小堆有一點相似,對於大頂堆,我們常用樹的方式理解,但是實際上可以用線性表儲存(即陣列),因此它需要是一棵完全二叉樹(中間不能缺節點)。本題中的maxtree只要求是二叉樹就行了~,限制少一些,所以構建的時間複雜度也比建立大頂堆低一些。(大根堆構建初堆的時間複雜度也是o(n)) 利用棧可以快速找出左邊和右邊第乙個比它大的值。

class maxtree 

else

if(a[i]else

}i=n-1;

while(i!=-1)

else

if(a[i]else

}for(int i=0;i!=n;++i)

return res;

}};

ssl2645 線段樹練習題2 線段樹變式

桌子上零散地放著若干個不同顏色的盒子,桌子的後方是一堵牆。如右圖所示。問從桌子前方可以看到多少個盒子?假設人站得足夠遠 輸入時,由底向上,從左到右 16 桌子長度 5 盒子數量47 121415 610111641 n 100000,1 m 100000,保證座標範圍為 1,n 可以這樣來看這道題 ...

ssl2646 線段樹練習題3 線段樹變式

給定一條長度為m的線段,有n個操作,每個操作有3個數字x,y,z表示把區間 x,y 染成顏色z,詢問染完色之後,這條長度為m的線段一共有幾種顏色。規定 線段的顏色可以相同。連續的相同顏色被視作一段。問x軸被分成多少段。20 四條,總長度為20 資料規模 n 10000 m 1000000 同樣是線段...

多維陣列變一維陣列

判斷是否是陣列 let isarr arr arr instanceof array 判斷是否一維陣列 let istdim arr arr.reduce o1,o2 o1 isarr o2 true 多維陣列變一維陣列function name return a console.log name ...