Python 最小的K個數

2021-10-04 18:19:21 字數 2388 閱讀 4136

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

最大堆的查詢時間複雜度為o(logk)

替換的複雜度也為o(logk)

輔助陣列的空間複雜度為o(k)

如果換為用陣列解決該問題,那麼

查詢的時間複雜度為o(logk)(採用折半查詢)

替換的複雜度為o(k)

輔助陣列的空間複雜度為o(k)

兩種方案的主要區別在於替換的複雜度,因此採用最大堆解決該問題。遇到類似的情況時,最小堆也有同樣的優勢。

# -*-coding:utf-8 -*-

class

solution

:def

getleastnumbers_solutions

(self, tinput, k)

:# 建立或者是插入最大堆

defcreatemaxheap

(num)

: currentindex =

len(maxheap)-1

while currentindex !=0:

parentindex =

(currentindex -1)

>>

1if maxheap[parentindex]

< maxheap[currentindex]

: maxheap[parentindex]

, maxheap[currentindex]

= maxheap[currentindex]

, maxheap[parentindex]

else

:break

# 調整最大堆,頭節點發生改變

defadjustmaxheap

(num)

:if num < maxheap[0]

: maxheap[0]

= num

maxheaplen =

len(maxheap)

index =

0while index < maxheaplen:

leftindex = index *2+

1 rightindex = index *2+

2 largerindex =

0if rightindex < maxheaplen:

if maxheap[rightindex]

< maxheap[leftindex]

: largerindex = leftindex

else

: largerindex = rightindex

elif leftindex < maxheaplen:

largerindex = leftindex

else

:break

if maxheap[index]

< maxheap[largerindex]

: maxheap[index]

, maxheap[largerindex]

= maxheap[largerindex]

, maxheap[index]

index = largerindex

maxheap =

inputlen =

len(tinput)

iflen

(tinput)

< k or k <=0:

return

for i in

range

(inputlen)

:if i < k:

createmaxheap(tinput[i]

)else

: adjustmaxheap(tinput[i]

) maxheap.sort(

)return maxheap

if __name__ ==

'__main__'

: tinput=[1

,2,4

,6,100,20

,9,10

] s=solution(

) result = s.getleastnumbers_solutions(tinput,4)

for i in

range(0

,4):

print

(result[i]

)

執行結果為:

124

6

Python 最小的 k 個數

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

最小的K個數(Python)

題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,這個題目完成的思路有很多,很多排序演算法都可以完成既定操作,關鍵是複雜度性的考慮。以下幾種思路當是筆者拋磚引玉,如果讀者有興趣可以自己再使用其他方法一一嘗試。思路1 利用...

python 最小的k個數

class solution def getleastnumbers solution self,t,k write code here if len t 0 or len t k or k 0 不設定k 0 返回,k為0時會陷入無限迴圈 return s 0 l len t 1 index sel...