面試題 17 14 最小K個數

2021-10-10 11:22:59 字數 1653 閱讀 7808

leetcode: 面試題 17.14. 最小k個數

easy 題 >> 但是這道題是想考什麼 ??

明顯很多種解法

排序暴力

topk 問題 >> 大頂堆

使用 bfprt 在o(n)內求解前k小的數 (最壞時間複雜度 o(n

)o(n)

o(n))

劍指 offer 40. 最小的k個數

中的解法一 : 基於快排的思想 >> 一次快排 + 二分查詢 k - 1 的位置, 最後形成的效果就是 k - 1 位置以前的數都是小於k - 1位置的, 後面的數都是大於 k-1位置的

bfprt演算法概念-參考:

bfprt演算法原理

bfprt 演算法(top-k 問題)

bfprt演算法解析

排序暴力

public

int[

]smallestk

(int

arr,

int k)

構建大頂堆

public

int[

]smallestk

(int

arr,

int k)

int[

] ans =

newint

[k];

for(

int i =

0; i < k; i++

)return ans;

}

bfprt 演算法一次快排 + 二分查詢

public

int[

]smallestk

(int

arr,

int k)

else

if(index < k -1)

// 退出條件

if(s > e)

break

; index =

qs(arr, s, e);}

// 提出結果

for(

int i =

0; i < k; i++

)return ans;

}/**

* 一次快排

* @return

*/public

intqs

(int

arr,

int s,

int e)

// 還要交換一次

面試題40 最小k個數

題目 輸入n個整數,找出其中最小的k個數 思路 1 如果輸入的陣列可以改變,則基於第k個數來調整,是第k個數左邊的數都小於第k個數,右邊的數都大於第k個數 時間複雜度o n 思路1 void printkminnumberbymethod1 int arr,int length,int k int ...

面試題之最小K個數

最小 最大k個數 是面試容易提及的其中乙個問題,此處用快排思路解決。思路 因為當選取的樞紐元等於k時,樞紐元左邊的序列元素必定小於k,右邊的序列元素必定大於k。儘管序列內部是無序的,但此時結果已符合題意。為避免產生多餘的排序工作,我們只需要在遞迴的時候分歧選擇最接近k的方向即可,一旦等於k就停止遞迴...

面試題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 ...