輸入整數陣列 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 <= 100000 <= arr[i] <= 10000
解法一:陣列計數
解法二: 快排策略
class
solution
//快排,得到排好位置的arr
quicksort
(arr,
0,arr.length-
1,k-1)
;//複製陣列
return arrays.
copyof
(arr,k);}
public
void
quicksort
(int
arr,
int start,
int end,
int k)
swap
(arr,i,j);}
//這裡一定是j,因為此時的arr[j]pivot不符合
swap
(arr,start,j)
;//用j交換就應該用j判斷
解法三:最大堆
class
solution
//最大堆
queue
deap=
newpriorityqueue
<
>
((o1,o2)
->o2-o1)
;for
(int i:arr)
//等於k 看是否小於峰頂,小於就彈出峰頂,加入新值
面試題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...