面試題40 最小的k個數

2021-10-06 10:15:49 字數 1237 閱讀 7904

輸入整數陣列 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

思路:直接想到的是排序然後取topk.但是這樣有點拉。可以使用快排思想優化,只要排到前k個就可以了

解法一:

class

solution

partition

(arr,

0,arr.length -

1,k)

;return arrays.

copyofrange

(arr,

0,k);}

public

void

partition

(int

arr,

int start,

int end,

int k)

if(left < right)

while

(left < right && arr[left]

<= p)

if(left < right)

} arr[right]

= p;

if(right == k)

if(right > k)

else

}}

解法二:維護乙個小頂堆,取前k. 或者維護乙個大頂堆,讓堆中始終最多存放k個值

class

solution

priorityqueue

priorityqueue =

newpriorityqueue

<

>()

;for

(int i =

0; i < arr.length; i++

)int

res =

newint

[k];

for(

int i =

0;i < k;i ++

)return res;

}}

面試題40 最小k個數

題目 輸入n個整數,找出其中最小的k個數 思路 1 如果輸入的陣列可以改變,則基於第k個數來調整,是第k個數左邊的數都小於第k個數,右邊的數都大於第k個數 時間複雜度o n 思路1 void printkminnumberbymethod1 int arr,int length,int k int ...

面試題40 最小的K個數

輸入n個整數,找出其中最小的k個數。例如輸入4 5 1 6 2 7 3 8 這8個數字,則最小的4個數字是1 2 3 4。分析 這道題最簡單的思路莫過於把輸入的n個整數排序,排序之後位於最前面的k個數就是最小的k個數,這種思路的時間按複雜度是o nlogn 2.1 方法一 時間複雜度為o n 的演算...

面試題40 最小的K個數

題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,方法一 不修改原陣列,時間複雜度o nlgk class solution if result k 1 input i result k 1 input i return...