劍指offer 40 最小的k個數

2021-10-09 17:22:01 字數 1704 閱讀 5557

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

示例 1:

輸入:arr = [3,2,1], k = 2

輸出:[1,2] 或者 [2,1]

示例 2:

輸入:arr = [0,1,2,1], k = 1

輸出:[0]

限制:

0 <= k <= arr.length <= 10000

0 <= arr[i] <= 10000

設定乙個最大堆,儲存當前最小的k個數。每次有新數字時,如果最大堆內數字數目小於k,則直接將新數字插入堆中;否則,將新數字與最大堆堆頂的值(即最小的k個數中的最大值)進行比較,如果小於最大堆堆頂值,則將最大堆堆頂值彈出,將新數字加入堆中。直到所有數字遍歷完畢,最大堆中的k個數字即為陣列中最小的k個數。

最大堆方法的時間複雜度o(nlogk),空間複雜度o(k)。

**

class

solution;if

(arr==null || arr.length<=

0|| k<=0)

return res;

priorityqueue

maxheap =

newpriorityqueue

(10,new

comparator

()})

;for

(int i=

0; i)else}}

int i=0;

res =

newint

[maxheap.

size()

];for(integer in : maxheap)

return res;

}}

快排在這道題中不用把整個陣列進行排序,只需切分得到第k個數,則其左側的k-1個數都小於第k個數,又側的(n-k)個數都大於k,因此可以直接返回前k個數。

快速排序方法的時間複雜度o(n)(如果是整個陣列都排序則是o(nlogn)),空間複雜度o(1)。

**

class

solution

public

void

quicksort

(int

arr,

int start,

int end,

int k)

else

}public

intpartition

(int

arr,

int left,

int right)

if(leftwhile

(left<=pivot)

if(leftarr[left]

= pivot;

}return left;

}}

氣泡排序每輪將最小的移到前面,執行k輪即得到最小的k個數。

氣泡排序算是這三個方法裡面最慢的,時間複雜度o(k(n-k))。

class

solution}}

int[

] res =

newint

[k];

int i=0;

while

(ireturn res;

}}

劍指offer40 最小的k個數

輸入n個整數,找出其中最小的k個數。注意 資料保證k一定小於等於輸入陣列的長度 輸出陣列內元素請按從小到大順序排序 樣例 輸入 1,2,3,4,5,6,7,8 k 4 輸出 1,2,3,4 思路1 用大頂堆儲存k個數,然後不斷的遍歷陣列,若是陣列中的數小於堆頂元素,則替換。實踐複雜度為o nlogk...

劍指offer40 最小的 K 個數

題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,思路 方法一 維護乙個大小為k的大頂堆,複雜度 o nlogk o k 特別適合處理海量資料 public class solution priorityqueuemax...

劍指offer40 最小的k個數

問題描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,方法1 o nlogn def getleastnumbers input,k input.sort return input 4 a sorted input inpu...