劍指offer 最小的k個數 兩種解法

2021-09-01 23:48:52 字數 2010 閱讀 8452

題目描述

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