最小的K個數

2021-10-04 04:35:02 字數 1238 閱讀 6763

題目:輸入整數陣列 arr ,找出其中最小的 k 個數。例如,輸入4、5、1、6、2、7、3、8這8個數字,則最小的4個數字是1、2、3、4

leetcode鏈結

我們用乙個大根堆實時維護陣列的前 k小值。首先將前 k個數插入大根堆中,隨後從第 k+1個數開始遍歷,如果當前遍歷到的數比大根堆的堆頂的數要小,就把堆頂的數彈出,再插入當前遍歷到的數。最後將大根堆裡的數存入陣列返回即可。由於 c++ 語言中的堆(即優先佇列)為大根堆,而python 語言中的堆為小根堆,因此我們要對陣列中所有的數取其相反數,才能使用小根堆維護前 k 小值

class

solution

:def

getleastnumbers

(self, arr: list[

int]

, k:

int)

-> list[

int]

:if k ==0:

return

list()

hp =

[-x for x in arr[

:k]]

heapq.heapify(hp)

for i in

range

(k,len

(arr)):

if-hp[0]

> arr[i]

:# 如果堆頂元素大於 當前值 則需要替換

-arr[i]

) ans =

[-x for x in hp]

return ans

class

solution

:def

smallestk

(self, arr: list[

int]

, k:

int)

-> list[

int]

:if k ==0:

return

list()

hp =

[-x for x in arr[

:k]]

heapq.heapify(hp)

for i in

range

(k,len

(arr)):

-arr[i]

) ans =

[-x for x in hp]

return ans

最小的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...