面試題40 最小的k個數 中等

2021-10-04 19:53:33 字數 1434 閱讀 3616

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

構建乙個大小為k的大堆,當大堆的size注意k=0的情況。

public

static

int[

]getleastnumbers

(int

data,

int k)

else

if(num < pq.

peek()

)}int[

] res =

newint

[pq.

size()

];int index =0;

for(

int num : pq)

return res;

}

時間複雜度:o(nlogk),插入乙個logk,要插入n個

空間複雜度:k

class

solution

// 最後乙個引數表示我們要找的是下標為k-1的數

return

quicksearch

(arr,

0, arr.length -

1, k -1)

;}private

int[

]quicksearch

(int

nums,

int lo,

int hi,

int k)

// 否則根據下標j與k的大小關係來決定繼續切分左段還是右段。

return j > k?

quicksearch

(nums, lo, j -

1, k)

:quicksearch

(nums, j +

1, hi, k);}

// 快排切分,返回下標j,使得比nums[j]小的數都在j的左邊,比nums[j]大的數都在j的右邊。

private

intpartition

(int

nums,

int lo,

int hi)

int t = nums[j]

; nums[j]

= nums[i]

; nums[i]

= t;

} nums[lo]

= nums[j]

; nums[j]

= v;

return j;

}}

面試題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...