輸入n個整數,找出其中最小的K個數

2021-09-16 19:57:31 字數 1585 閱讀 6756

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

牛客網題目鏈結

使用最大堆實現,

1.構建大小為k的最大堆;

2.如果新元素小於當前最大堆的堆頂元素,則替換堆頂,調整最大堆;

3.題目要求按照從小到大順序輸出最小的k個數,所以最後需要利用最大堆排序k個值。

class

solution

:def

getleastnumbers_solution

(self, tinput, k)

:# write code here

ifnot tinput or k<=

0or k>

len(tinput)

:return

for i in

range

(int

(k/2-1

),-1

,-1)

:#建立大小為k的最大堆,注意從底層往上調整,i需要取到0

self.adjustmaxheapsort(tinput,i,k-1)

for i in

range

(k,len

(tinput)):

if tinput[i]

: tinput[0]

,tinput[i]

=tinput[i]

,tinput[0]

self.adjustmaxheapsort(tinput,

0,k-1)

res=tinput[

:k]for i in

range

(len

(res)-1

,0,-

1):#利用最大堆排序k個陣列

res[0]

,res[i]

=res[i]

,res[0]

self.adjustmaxheapsort(res,

0,i-1)

#調整剩下的最大堆

return res

defadjustmaxheapsort

(self,heaplist,pos,length)

:#length是從0計數的,實際排序長度為length+1

ifnot heaplist:

return

none

temp=heaplist[pos]

j=2*pos+

1#轉到子節點(完全二叉樹左子節點索引是父節點的2倍+1)

while j<=length:

if j:#左節點小於右節點值

j+=1#左節點+1,轉到右節點索引

if temp>heaplist[j]

:break

heaplist[pos]

=heaplist[j]

#交換父節點和子節點

pos=j #子節點賦值給當前位置,也就是下乙個要調整的位置

j=2*j+

1#轉到pos節點的左子節點,繼續下一輪迴圈

heaplist[pos]

=temp

輸入n個整數,找出其中最小的K個數。

題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,思路 可以使用排序 這裡我採用快排,獲取到乙個有順序的陣列,然後獲取它的前n個 先使用快排排序 public static void quicksort int arr,in...

輸入n個整數,輸出其中最小的k個

輸入n個整數,輸出其中最小的k個。詳細描述 介面說明 原型 bool getmink unsignedint uiinputnum,int pinputarray,unsignedint uik,int poutputarray 輸入引數 unsignedint uiinputnum 輸入整數個數 ...

劍指offer 輸入n個整數,找出其中最小的K個數

最小的k個數 題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,本題無非就是排序,取前k個值。但選什麼排序演算法呢?基於堆排序演算法,構建最大堆。時間複雜度為o nlogk 如果用快速排序,時間複雜度為o nlogn 如...