要求:rt
思路:
法一:大根堆,时间复杂度:O(nlogk),其中 n 是数组 arr 的长度。由于大根堆实时维护前 kk 小值,所以插入删除都是 O(logk) 的时间复杂度,最坏情况下数组里 n 个数都会插入,所以一共需要 O(nlogk) 的时间复杂度。
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
if(k==0)return {};
priority_queue<int,vector<int>,less<int>> maxheap;
for(int i=0;i<k;i++)
maxheap.push(arr[i]);
int n=arr.size();
for (int i = k; i < n; ++i) {
if (arr[i] < maxheap.top()) {//会被弹出去
maxheap.pop();
maxheap.push(arr[i]);
}
}
vector<int> vec(k);
for (int i = 0; i < k; ++i) {
vec[i] = maxheap.top();
maxheap.pop();
}
return vec;
}
};
法二:快排找第k-1索引
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
if(k==0)return {};
int l=0,r=arr.size()-1;
int num=-1;
while(true){
num=partition(arr,l,r);
if(num==k-1)break;
else if(num<k-1)l=num+1;
else r=num-1;
}
vector<int> res;
for(int i=0;i<k;++i)
res.push_back(arr[i]);
return res;
}
int partition(vector<int> ×,int l,int r){
int i=l,j=r;
int pivot=times[l];
while(i<j){
while(i<j&×[j]>=pivot)
j--;
times[i]=times[j];
while(i<j&×[i]<=pivot)
i++;
times[j]=times[i];
}
times[i]=pivot;
return i;
}
};