劍指Offer 29 最小的K個數

2021-10-04 00:19:48 字數 1792 閱讀 1298

題目描述

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

題解一:快排

1

public

static arraylistgetleastnumbers_solution(int input, int

k) 6

arrays.sort(input);

7for(int i=0;i)

10return

res;

11 }

題解二:堆排序

1

//使用priorityqueue當作heap,每次返回最大的值。2//

time complexity is o(nlogk)

3public arraylistgetleastnumbers_solution02(int input, int

k) 8 queuequeue = new priorityqueue<>(k, collections.reverseorder());910

for (int i = 0; i < input.length; i++) else19}

20}21while (!queue.isempty())

24return

res;

25 }

題解三:手寫最大堆實現

1

public arraylistgetleastnumbers_solution05(int input, int

k) 7

int target = new

int[k];

8int len =input.length;

9for (int i = 0; i < len; ++i) else19}

20}21for (int i = 0; i < k; ++i)

24return

list;25}

2627

private

void heapinsertsiftup(int target, int index, int

x) else36}

37 target[index] =x;38}

3940

private

boolean greater(int i, int

j) 43

private

void siftdown(int target, int k, int

x) 53

if (greater(x, big)) //

往上拉不動了,準備退出把最初堆頂的結點賦值到上乙個結點

56 target[k] = big; //

往上拉57 k =child;58}

59 target[k] =x;

60 }

測試:

1

public

static

void

main(string args) ;

3int k=4;

4 arraylistlist =getleastnumbers_solution(input, k);

5 string string =arrays.tostring(list.toarray());

6system.out.println(string);7}

8 輸出:[1, 2, 3, 4]

劍指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...