給定乙個沒有重複元素的陣列a,定義a上的maxtree如下:maxtree的根節點為a中最大的數,根節點的左子樹為陣列中最大數左邊部分的maxtree,右子樹為陣列中最大數右邊部分的maxtree。請根據給定的陣列a,設計乙個演算法構造這個陣列的maxtree。
如果能夠確定每個節點的父親節點,則可以構造出整棵樹。找出每個數往左數第乙個比他大的數和往右數第乙個比他大的數,兩者中較小的數即為該數的父親節點。如:[3,1,2],3沒有父親節點,1的父親節點為2,2的父親節為3。並且可以根據與父親的位置關係來確定是左兒子還是右兒子。接下來的問題是如何快速找出每個數往左、往右第乙個比他大的數。這裡需要用到資料結構棧。以找每個數左邊第乙個比他大的數為例,從左到右遍歷每個數,棧中保持遞減序列,新來的數不停的pop出棧頂直到棧頂比新數大或沒有數。以[3,1,2]為例,首先3入棧,接下來1比3小,無需pop出3,1入棧,並且確定了1往左第乙個比他大的數為3。接下來2比1大,1出棧,2比3小,2入棧。並且確定了2往左第乙個比他大的數為3。用同樣的方法可以求得每個數往右第乙個比他大的數。時間複雜度o(n),空間複雜度也是o(n)為最優解法。
首先容易想到的是使用遞迴的方法來構造maxtree,每一層遞迴用o(n)的時間找到最大數,然後將陣列分為左右兩個部分,然後遞迴完成構造。這種演算法在極端情況下複雜度可能達到o(n^2),所以並不能被面試官所接受。但是你首先至少要把這種暴力的方法答出,並分析出最壞時間複雜度,因為這至少也體現出了你一部分的演算法能力和時間複雜度分析的技巧。萬一後面的正確方法答不出來,至少不會是0分。最優演算法所使用到的stack的方法,是乙個非常常用的解題技巧。我們在今後的面試題中也會陸續為為大家講解涉及到這種方法的題目。
九章演算法 Google面試題 內積
描述 給定長度為n的a陣列,長度為k的b陣列 你可以從a陣列裡取k個數 規則如下 即每次可以從a陣列的最左邊或者最右邊取走乙個數,取走的數從陣列中移除 將取出的ai按取出的順序組成c陣列 求b與c的內積最大值 b與c內積為 i 0k 1bi ci 解釋1 a 1,4,3,2,5 b 1,2,3,4 ...
九章演算法面試題32 小球排序
有紅黃藍三色的小球若干排成一列,這些小球進行排序,請使用盡量少的空間和時間。假設順序為紅色黃色藍色。用兩根指標從頭開始遍歷,第一根指標遇到非紅色時停下,如果第二根指標找到第一根指標之後的第乙個紅色停下,交換兩根指標所指顏色。重複上述過程。直到第二根指標找不到任何紅色。此時第一根指標到最後都是黃色或藍...
九章演算法面試題33 陣列波峰
乙個陣列a 1.n 假設陣列中沒有任何相鄰兩數相等,滿足a 1 n。a i 被稱為波峰,當且僅當a i a i 1 並且a i a i 1 請找到陣列中的乙個波峰。假設陣列中存在相鄰相等的數,該怎麼做?根據條件a 1 a n 可知a中一定存在波峰。用二分法,選擇中點mid,如果a mid 是波峰,則...