微軟等資料結構與演算法面試100題 第五題

2021-06-08 14:02:01 字數 1345 閱讀 8284

第五題

查詢最小的k個元素

題目:輸入n個整數,輸出其中最小的k個。

例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字為1,2,3和4。

分析: 本題目要求計算n個整數的最小的k個,題目沒有直接給出複雜度的要求,因此有很多種解法。

比如排序後一次輸出等 很多種解法。如果是要求複雜度為klogn的話比較容易想到可以使用分治(遞迴)演算法。

在這裡我們使用了兩種方法,第乙個是比較經典的最小堆演算法,第二種就是分治演算法。在這裡需要說明的一點就是其實這兩種演算法的本質是一樣的,應該都可以算是遞迴或者分治。只是實現的時候表達出來不一樣罷了。

最小堆**:

#includeusing namespace std;

class minheap

bool insert(const int node);

void siftup(int pos);

void siftdown();//放入左子樹中

int removemin();

};int minheap::parent(int pos) const

minheap::minheap(const int size)

bool minheap::insert(const int node)

}void minheap::siftup(int pos)

else

}else if (data[i] > data[2*i+1])

else

} }int minheap::removemin()

int main()

; for(int i = 0; i < sizeof(a)/ sizeof(int) ; i++)

b.insert(a[i]);

for(int i = 0; i < sizeof(a)/ sizeof(int) ; i++)

cout<

遞迴**(最大):

#includeusing namespace std;

void maxheap(int *a, int length, int index)

//只有左子樹

else if(index*2+1==length-1)

} else

}else

} }}int maxheapdelete(int *a, int length)

int main();

//maxheap(a,8,0);

//cout

for(int i=0; i<8;i++)

//for(int i=0; i<8; i++) cout<}

微軟等資料結構與演算法面試100題 第七題

第七題 微軟亞院之程式設計判斷倆個鍊錶是否相交 給出倆個單向鍊錶的頭指標,比如h1,h2,判斷這倆個鍊錶是否相交。為了簡化問題,我們假設倆個鍊錶均不帶環。問題擴充套件 1.如果鍊錶可能有環列?2.如果需要求出倆個鍊錶相交的第乙個節點列?分析 實現 includeusing namespace std...

微軟等資料結構與演算法面試100題 第十題

第十題 翻轉句子中單詞的順序。題目 輸入乙個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。句子中單詞以空格符隔開。為簡單起見,標點符號和普通字母一樣處理。例如輸入 i am a student.則輸出 student.a am i 分析 可以根據空格符將單詞分開,然後針對每個單詞進行操作,...

微軟等資料結構與演算法面試100題 第十五題

第十五題 題目 輸入一顆二元查詢樹,將該樹轉換為它的映象,即在轉換後的二元查詢樹中,左子樹的結點都大於右子樹的結點。用遞迴和迴圈兩種方法完成樹的映象轉換。分析 題目要求求解乙個二元搜尋樹的映象,用兩種方法實現,遞迴和非遞迴。首先,對於求解乙個二元搜尋樹映象其實就是把樹中的每個節點的左右子樹調換了即可...