劍指offer 29 最小的K個數 Python

2021-10-06 16:13:33 字數 1841 閱讀 3754

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

考點:時間效率

如果對排序有興趣,可以看討論中的熱評牛客。

方法一:

sorted

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

class

solution

:def

getleastnumbers_solution

(self, tinput, k)

:# write code here

iflen

(tinput)

< k or k ==0:

return

tmp =

sorted

(tinput)

return tmp[

:k]

方法二:

堆排序,複雜度o(nlogk)。

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

class

solution

:def

getleastnumbers_solution

(self, tinput, k)

:# write code here

#常規判斷

if k >

len(tinput)

or k ==0:

return

n =len(tinput)

a = tinput[

:k]# 前k個數建立大頂堆

#非葉子節點

for i in

range

(k//2-

1,-1

,-1)

: self.initiate(i, a, k)

# 對剩下的n-k個數進行判斷

for i in

range

(k, n)

:if tinput[i]

< a[0]

: a[0]

= tinput[i]

self.initiate(

0, a, k)

for i in

range

(len

(a)-1,

-1,-

1): a[i]

, a[0]

= a[0]

, a[i]

self.initiate(

0, a, i)

return a

definitiate

(self, index, a, length)

:#非葉子節點

temp = a[index]

#該節點的左節點

j = index*2+

1while j < length:

#左右比較

if j+

1< length and a[j+1]

> a[j]

:#指向右

j +=

1#和該節點的根節點比較

if a[j]

> temp:

#比根節點大,替換根節點

a[index]

= a[j]

index = j

else

:break

#到下一層

j = j*2+

1 a[index]

= temp

劍指Offer (29)最小的k個數

題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4。實現如下 測試用例中給出的返回值是有序的。嘖嘖。找到序列中最小的k個數,利用set,對數字進行insert或erase 紅黑樹中查詢 插入 刪除操作都為 o logk 最...

劍指offer 29 最小的K個數

題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,思路分析 簡單思路 先快排,再取數 coding utf 8 class solution def getleastnumbers solution self,tinput,...

劍指offer 29 最小的K個數

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4。最簡單容易想到的就是先排序,然後輸出前k個數即可。但是這樣明顯時間複雜度比較高。也可以使用另外的方法,具體不再詳述。class solution for int i 0 i inp...