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