輸入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 如...