思路:
基於快排改進
選取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 ...