题目
给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
0 <= k <= input.length <= 10000
0 <= input[i] <= 10000
sort()解法
function GetLeastNumbers_Solution(input, k)
{
// write code here
var arr=input.sort((a,b)=>{
return a-b
})
return arr.slice(0,k)
}
module.exports = {
GetLeastNumbers_Solution : GetLeastNumbers_Solution
};
快排解法
function GetLeastNumbers_Solution(input, k)
{
// write code here
return quick(input,0,input.length-1).slice(0,k)
}
function quick(arr,left,right){
if(arr.length>1){
var index=partition(arr,left,right)
if(index-1>left){
quick(arr,left,index-1)
}
if(index<right){
quick(arr,index,right)
}
}
return arr
}
function partition(arr,left,right){
var i=left,j=right
const goal=arr[left]
while(i<=j){
while(arr[i]<goal){
i++
}
while(arr[j]>goal){
j--
}
if(i<=j){
[arr[i],arr[j]]=[arr[j],arr[i]]
i++
j--
}
}
return i
}
module.exports = {
GetLeastNumbers_Solution : GetLeastNumbers_Solution
};
c++堆排序
优先队列堆排序是最适合的解法,js没有优先队列,自己写麻烦,用c++给大家表演一个
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> res;
if(k==0) return res;
priority_queue<int,vector<int>,less<int>> maxHeap;
for(int value:input){
if(maxHeap.size()<k){
maxHeap.push(value);
}else{
if(maxHeap.top()>value){
maxHeap.pop();
maxHeap.push(value);
}
}
}
while(!maxHeap.empty()){
res.push_back(maxHeap.top());
maxHeap.pop();
}
return res;
}
};