「取最大的K的數」的兩種解法

2021-07-05 05:42:37 字數 1757 閱讀 6482

輸入n個整數,輸出其中最大的k個。例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字為5,6,7和8。

開乙個容量為k的最堆。每次來乙個數,比較堆頂(最小值)和這個數誰大,如果當前的數更大,就替換掉堆頂。時間複雜度 o(

nlogk)

優點:對於海量資料(流),可以用o(

k)的記憶體搞定

缺點:堆的實現略複雜,建議直接用stl

用quickselect(快速選擇)演算法,是基於快排的一種變體,平均複雜度為 o(

n)

優點:平均情況下速度快

缺點:需要儲存所有輸入資料,並且會修改輸入資料,對於海量資料不合適。

包含一些測試寫在main()裡。

最大子段和的兩種解法

1.貪心和動態規劃 實質一樣。前面和sum i 1 0sum 0 sumi 1 0就丟掉,然後加上a ia i ai 就是以a ia i ai 結尾的最大子段和。2.分治法。遞迴到l r l rl r時,顯然最大子段和是a ia i ai 對於區間 l,r l,r l,r 我們需要維護4個變數。1....

八皇后的兩種解法

public class eightqueue return true 遞迴解法 public int cal int i if x i 8 i 8 遞迴到了最後乙個地方 尋找到了合適位置,向下一列尋找位置 else if i 8 x i 8 else 非遞迴解法 public int calcul...

求素數的兩種解法

檔名 exp1 1.cpp 求素數的個數 include include bool prime int n 判斷正整數n是否是素數 int main for i 3 i n i 2 printf n return 0 檔名 exp1 1 2.cpp 利用快速篩選法求素數的個數 篩法的思想是去除要求範...