最小的K个数
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,8,3这8个数字,则最小的4个数字为1,2,3,4。
题解:
这里主要提供两种方法,或者说是一种方法,但是实现方法不同。
1)函数法:
利用c++库中的排序函数对输入进行排序,输出前K个数。
代码如下:
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> res;
if(input.size()==0||k==0||k>input.size())
return res;
sort(input.begin(),input.end());
for(int i=0;i<k;i++)
res.push_back(input[i]);
return res;
}
};
2)自行编写堆排序函数,建立一个K个数的最大堆函数,则根节点则是前k个数最大的数,将后面的数逐一与堆中的最大数进行比较,若大于,则将两数进行交换。然后重新建立一个最大堆,更新此时堆中的最大值。直到比较完所有输入的整数。
代码如下:
class Solution {
public:
//vector<int> res;
void swap(int &a,int &b){
int t=a;
a=b;
b=t;
}
void adjust(vector<int> &temp,int root,int n){
if(root>=n)
return;
int left=2*root+1;
int right=2*root+2;
int parent=root;
if(right<n)
if(temp[parent]<temp[right]){
parent=right;
}
if(left<n)
if(temp[parent]<temp[left]){
parent=left;
}
if(parent!=root){
swap(temp[parent],temp[root]);
adjust(temp,parent,n);
}
}
vector<int> heap(vector<int> input, int k){
vector<int> temp;
for(int i=0;i<k;i++)
temp.push_back(input[i]);
for(int i=k/2-1;i>=0;i--)
adjust(temp,i,k);
/*for(int i=k-1;i>=1;i--){
swap(temp[i],temp[0]);
adjust(temp,0,i);
}*/
for(int i=k;i<input.size();i++){
if(input[i]<temp[0]){
temp[0]=input[i];
adjust(temp,0,k);
}
}
return temp;
}
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
/*vector<int> res;
if(input.size()==0||k==0||k>input.size())
return res;
sort(input.begin(),input.end());
for(int i=0;i<k;i++)
res.push_back(input[i]);
return res;
*/
vector<int> res;
if(input.size()==0||k==0||k>input.size())
return res;
res=heap(input,k);
return res;
}
};