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