一、(leetcode 剑指Offer 40)最小的k个数
题目描述:
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
思路:
方法1:大顶堆
方法2:快排
代码如下:
大顶堆:
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
if(k==0) return vector<int>();
priority_queue<int>q;
for(int &a:arr){
if(q.size()<k){
q.push(a);
}
else{
if(q.top()<=a) continue;
else{
q.pop();
q.push(a);
}
}
}
vector<int>res;
while(!q.empty()){
res.push_back(q.top());
q.pop();
}
return res;
}
};
快排:
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
if(k==0||arr.size()==0) return {};
quickSearch(arr,0,arr.size()-1,k);
vector<int>res(arr.begin(),arr.begin()+k);
return res;
}
int dfs(vector<int>&arr,int left,int right){
int pivot=arr[left];
while(left<right){
while(arr[right]>=pivot&&right>left){
right--;
}
arr[left]=arr[right];
while(arr[left]<=pivot&&right>left){
left++;
}
arr[right]=arr[left];
}
arr[left]=pivot;
return left;
}
void quickSearch(vector<int>&arr,int left,int right,int k){
int j=dfs(arr,left,right);
if(j==k-1) return;
else if(j>k-1) quickSearch(arr,left,j-1,k);
else if(j<k-1) quickSearch(arr,j+1,right,k);
}
};