演算法面試題之求前1000大 在樹上判斷節點父子關係

2021-06-28 04:42:43 字數 1077 閱讀 8294

一、有10億個雜亂無章的數,怎樣最快地求出其中前1000大的數。

想答對這個題是非常簡單的,建立乙個大小為1000的小根堆就可以了。這個堆滿足兩個性質:

1.堆中的元素個數總是小於等於1000的

2.堆頂取出的元素總是這個堆裡面最小的那乙個

這樣,這個題可以這樣做:

priority_queueq;

while (cin>>n)

}}

這個做法時間複雜度是o(nlog(1000)),空間複雜度是o(1000),對於這個題來說已經非常快了大約是o(10n)。

二、一棵樹節點1, 2, 3, ... , n. 怎樣實現:

先進行o(n)預處理,然後任給兩個節點,用o(1)判斷它們的父子關係

這個題目是dfs序的簡單應用,首先來看看什麼是dfs序,對於一棵樹,有下面4條邊:

1-2,

1-3,

2-4,

2-5

那麼,它的dfs序是:1,2,4,5,3,這裡只是通過一次簡單的深度優先搜尋把每個節點訪問的次序標了出來,如果每個節點在被訪問的這一刻記錄一次,訪問結束的時候再記錄一次,那又能是什麼樣子呢?**是這樣的:

int dfs(int i)

{ q.push_back(i);

for (int j=0;j

此時,上面這幅圖,它的dfs序變成了:1,2,4,4,5,5,2,3,3,1。

觀察這個序列,可以發現:節點i是節點j的祖先,當且僅當節點i出現的兩個位置x1,x2在節點j出現的兩個位置y1,y2的兩邊,也就是x1

三. 給定乙個二叉樹,求其中n(n>=2)個節點的最近公共祖先節點。

這道題跟上面那道題解法非常像,首先求出來dfs序,拿第二題為例,dfs序為1,2,4,4,5,5,2,3,3,1,此時,要求4,5,3三個節點的最近公共祖先,怎麼求呢?直接從4,5,3dfs序出現的最早位置開始列舉,遇到的第乙個dfs序出現位置小於等於它,結束位置大於等於這三個節點最早結束位置的節點,就是我們要求的解,對於這個樣例,l=3,r=9,代表4,5,3出現的最早和最遲位置,答案是1,因為l[1]=1<=3,r[1]=11>=9。

時間複雜度o(n)。

一道面試題, 求 1000!的位數 VBS實現

大數加法 引數 x 加數,y 被加數 以陣列儲存 function getaddresult x,y dim arrr strx,stry,lx,ly strx strreverse x stry strreverse y lx len strx ly len stry msgbox lx dim ...

面試題之 常用排序演算法

以下排序預設排序效果是從小到大,待排序序列 3,4,63,4,9,0,1,32,2 基本思想 依次交換相鄰兩個元素,使得大的資料往下沉 或小的資料往上附浮 第一步 比較相鄰的兩個元素,如果前者比後者大,則交換兩元素。否則,不交換。第二步 重複第一步直到最後兩個元素比較完成,此時,最大的元素已經在最後...

演算法面試通關40講 23 面試題 求眾數

給定乙個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列 現次數大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在眾數。示例 1 輸入 3,2,3 輸出 3示例 2 輸入 2,2,1,1,1,2,2 輸出 2sorting class solution class solutio...