面试题 17.14. 最小K个数
设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。
方法一:快排取前k
时间复杂度O(nlogn)
方法二:遍历+二分查找+维护一个有序小数组【超时】
时间复杂度O(nklogk)
class Solution {
public:
vector<int> smallestK(vector<int>& arr, int k) {
vector ret(arr.begin(), arr.begin() + k);
sort(ret.begin(), ret.end());
for(int i = k; i < arr.size(); i++){
int l = 0, r = k - 1;
while(l <= r){
int mid = (r - l) / 2 + l;
if(arr[i] >= ret[mid]){
l = mid + 1;
}
else{
r = mid - 1;
}
}
for(int j = k - 1; j > l; j--){
ret[j] = ret[j - 1];
}
if(l < k){
ret[l] = arr[i];
}
}
return ret;
}
};
方法三:大根堆
时间复杂度O(nlogk)
class Solution {
public:
vector<int> smallestK(vector<int>& arr, int k) {
vector<int> ret(k);
if(k == 0){
return ret;
}
priority_queue<int> heap;
for(int i = 0; i < k; i++){
heap.push(arr[i]);
}
for(int i = k; i < arr.size(); i++){
if(heap.top() > arr[i]){
heap.pop();
heap.push(arr[i]);
}
}
for(int i = k - 1; i >= 0; i--){
ret[i] = heap.top();
heap.pop();
}
return ret;
}
};