最小的K個數

2021-09-25 10:38:00 字數 1391 閱讀 2433

題目描述

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

方法:

用最大堆實現,先建立乙個k大堆,然後不斷比較維護乙個k大堆。最後再運用k大堆對k個樹從小到大排列輸出。

class

solution

:def

duipai

(self,i,heaplist,listlen)

: heaplist[0]

= heaplist[i]

j = i*

2while

(j <= listlen)

:if j < listlen and heaplist[j]

< heaplist[j+1]

: j = j+

1if heaplist[0]

>= heaplist[j]

:break

heaplist[i]

= heaplist[j]

i = j

j = j*

2 heaplist[i]

= heaplist[0]

defgetleastnumbers_solution

(self, tinput,k)

:# write code here

iflen

(tinput)

< k or k ==0:

return

'''取前k個數進行堆排'''

list2 = tinput[

0:k]

list2 =[0

]+ list2

for i in

range

(k //2,

0,-1

):self.duipai(i,list2,k)

'''從第k+1個數開始與堆頂比較'''

for value in tinput[k:]:

if value < list2[1]

: list2[1]

= value

self.duipai(

1,list2,k)

'''最後k個值堆排實現從小到大排列'''

for m in

range

(k,1,-

1): list2[m]

,list2[1]

= list2[1]

,list2[m]

self.duipai(

1,list2,m -1)

return list2[1:

]

最小的K個數

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

最小的K個數

從 陣列中出現次數超過一半的數字 得到啟發,同樣可以基於partition函式來解決。一 o n 演算法 void getleastnumbers int input,int n,int output,int k else for int i 0 i k i output i input i 二 o...

最小的K個數

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,如果不讓使用sort的話,自己實現乙個,或者依次選取最小的 class solution public vectorgetleastnumbers solution vectori...