题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
方法1:堆排序
class Solution {
public:
void HeapAdjust(vector<int> &input,int s,int n){
int l=s*2+1;
while(l<n){
if(l+1<n&&input[l+1]<input[l]){
l++;
}
if(input[l]<input[s]){
swap(input[s],input[l]);
s=l;
l=s*2+1;
}else{
break;
}
}
}
void BuildHeap(vector<int> &input,int n){
for(int i=(n-1)/2;i>=0;i--){
HeapAdjust(input,i,n);
}
}
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
int n=input.size();
BuildHeap(input,n);
vector<int> ans;
if(n<=0||k<=0||k<n)return ans;
for(int i=0;i<k;i++){
ans.push_back(input[0]);
swap(input[0],input[n-1-i]);
HeapAdjust(input,0,n-1-i);
}
return ans;
}
};
方法2:基于快速排序
int Partition(vector<int> &a,int l,int r){
int i=l;
for(int j=l;j<r;j++){
if(a[j]<a[r]){
swap(a[i++],a[j]);
}
}
swap(a[i],a[r]);
return i;
}
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
int n=input.size();
//k>n这个条件一定要加,不然就是数组越界
if(n<=0||k<=0||k>n)return vector<int>();
if(k==n) return input;
int l=0,r=n-1;
int index=Partition(input,l,r);
while(index!=k){
if(index>k){
r=index-1;
index=Partition(input,l,r);
}
if(index<k){
l=index+1;
index=Partition(input,l,r);
}
}
vector<int> ans(input.begin(),input.begin()+k);
return ans;
}