Leetcode 最小K個數

2021-10-03 04:30:59 字數 1134 閱讀 8138

思路:

基於快排改進

選取arr[0]作為基準值,tmp= arr[0],排序後,返回tmp的下標index

此時,arr[index] 左側的值都小於tmp, 右側的值都大於tmp。

如果k==index,那麼從起始點0到下標index-1的值就為最小的k個數,

如果k < index,說明k個數在區間[0,index-1]裡,重新繼續選取基準值進行排序

如果 k > index, 說明還有k-index個數在區間[index+1,-1]裡, 再次選取基準值在新區間排序。

def

quick

(arr,low.high)

: tmp = arr[low]

while low < high:

while low < high and arr[high]

>= tmp:

high -=

1 arr[low]

= arr[ high]

while low < high and arr[low]

<= tmp:

low +=

1 arr [high]

= arr[low]

arr[low]

= tmp

return low

def

knumber

(arr,k)

:if k >

len(arr)

or k <=0:

return

low =

0 high =

len(arr)-1

index = quick(arr,low,high)

while index != k-1:

if k-

1> index;

low = index +

1 index = quick(arr,low,high)

if k-

1< index :

high = index -

1 index = quick(arr,low,high)

return arr[

:k]

Leetcode之 最小的k個數

輸入整數陣列 arr 找出其中最小的 k 個數。例如,輸入4 5 1 6 2 7 3 8這8個數字,則最小的4個數字是1 2 3 4。雜湊表,題目中給定arr.length 10000,arr i 10000,則建立乙個hash陣列記錄每個數字出現的次數,之後從hash 0 開始輸出,若hash i...

leetcode 最小的k個數 使用快速排序

class solution int part vector arr,int begin,int end int pivot arr begin int i begin,j end while ipivot i用排序來做的,主要複習一下快速排序,寫乙個分割槽函式part,將陣列在begin end之...

最小的K個數

問題描述 給定的n個整數,計算其中最小的k個數。最直觀的解法莫過於將n個數按公升序排列後輸出前k個。但是就效率來看,這種方法並不是最理想的。一種改進方法是借助快速排序中對陣列的劃分,以第k個元素對陣列進行劃分,使得比第k個數字小的數字都在其左邊,比其大的數字都在它的右邊。void swap int ...