面試題30 最小的k個數

2021-07-04 04:31:48 字數 655 閱讀 6387

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

思路1:按遞增排序,然後輸出前k個數,簡單粗暴,時間複雜度o(nlogn)

思路2:利用partition演算法,找到第k大數,輸出其左邊k個數,時間複雜度o(n)

思路3:開乙個規模為k的陣列,遍歷原陣列,若輔助陣列未存滿k個數,那麼直接將遍歷到的數放入k陣列中;若已經存滿k個數,那麼,拿當前遍歷到的數 與 k陣列中最大數進行比較,若當前數小於k中最大數,則將兩者進行替換。

否則,丟棄當前數,繼續遍歷,直到遍歷完原陣列。時間複雜度o(nlogk)

其中,對於k陣列需要執行的操作是:1、找最大數;2、刪除最大數;3、插入新數。

這三步可以用二叉樹來實現,則時間複雜度o(logk)。

用stl的multiset來實現。還可以用大頂堆實現,但比較麻煩。

思路2的實現,參照前一篇部落格:

class solution }}

for(auto a : leastknum)

ans.push_back(a);

return ans;

}};

面試題30 最小的k個數

題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4.思路1,同29題一樣,利用快排思想,醉倒第k大的數,它左邊都比它小即可。o n 2,適合海量資料,利用堆資料結果,取數o 1 刪除和插入需要o k 總共n個數,時間複雜度o ...

面試題30 最小的k個數

1.輸入n個整數,找出其中的最小的k個數,例如輸入4,5,1,6,2,7,3,8 這8個數字,則其中最小的4個數字是1,2,3,4,分析 方法一,可以採用類似快速排序的解法,基於陣列中第k個數來進行調整,使得比第k個數字大的所有數字都在陣列的右邊,小的都在第k個數字的左邊。方法二 可以建立乙個大小為...

劍指offer 面試題30 最小的K個數

題目 輸入n個數,找出其中最小的k個數。例如輸入4 5 1 6 2 7 3 8這8個數字,則最小的4個數字是1,2,3,4。思路 這道題目是典型的top k問題。兩種方法 1 如果允許改變量列,半快速排序,是基準值正好為第k個數,那麼基準值左邊的都是小於它的,即可得到最小的k個數 求最大的過程類似 ...