題目描述
輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。
使用partition函式可以知道,使用o(n)的時間複雜度就可以找出第k大的數字,並且左邊的數字比這個數小,右邊的數字比這個數字大。因此可以取k為4,然後輸出前k個數字,如果需要排序的話再對結果進行排序
class
solution
:def
partitionofk
(self, numbers, start, end, k)
:if k <
0or numbers ==
or start <
0or end >=
len(numbers)
or k > end:
return
low, high = start, end
key = numbers[low]
while low < high:
while low < high and numbers[high]
>= key:
high -=
1 numbers[low]
= numbers[high]
while low < high and numbers[low]
<= key:
low +=
1 numbers[high]
= numbers[low]
numbers[low]
= key
if low < k:
self.partitionofk(numbers, start +
1, end, k)
elif low > k:
self.partitionofk(numbers, start, end -
1, k)
defgetleastnumbers_solution
(self, tinput, k)
:# write code here
if k <=
0or tinput ==
or k >
len(tinput)
:return
self.partitionofk(tinput,0,
len(tinput)-1
, k)
return
sorted
(tinput[
0:k]
)
占用記憶體:5732k
解法1存在兩個問題,乙個是partition把陣列的順序改變了,第二是無法處理海量的資料,海量的陣列全部匯入到記憶體裡面做partition顯然是不合適的。因此可以找出結果中最大的數字,如果遍歷的數字比這個數字小,則替換,否則不變,可以採用堆的形式來實現資料結構,達到o(logk)的複雜度,因此整體的時間複雜度為n*o(logk)
class
solution
:def
getleastnumbers_solution
(self, tinput, k)
:# write code here
if tinput ==
or k <=
0or k >
len(tinput)
:return
result =
for num in tinput:
iflen
(result)
< k:
else
:if num <
max(result)
: result[result.index(
max(result))]
= num
return
sorted
(result)
占用記憶體:5724k
時間和空間占用都比解法1更優。
劍指Offer 最小的K個數 兩種解法
1.問題描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,2.解題思路 方法1 使用stl 標準庫中的priority queue 容器 以下簡稱 容器 priority queue介紹 按順序遍歷整個陣列 容器中永遠儲存著...
劍指offer 最小k個數
1.題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,2.方法 1 基於堆排序演算法,構建最大堆。時間複雜度為o nlogk 2 如果用快速排序,時間複雜度為o nlogn 3 如果用插入排序,時間複雜度為o n 2 3.演...
劍指offer 最小的K個數
華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 10 4 題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,解析 基於插入排序的思想可以想到使用乙個長度為k的排序陣列儲存最小的k個元素,複雜度o nk 基於...