剑指offer二十九---最小的k个数
Posted linxuesong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer二十九---最小的k个数相关的知识,希望对你有一定的参考价值。
Markdown在线编辑器 - www.MdEditor.com
1.方法一:借助辅助数组存储k个最小的数
思想
存着最小k个数的数组,内部有序,遍历所有元素,和辅助数组中最大的比,只要小就替换辅助数组中的最大元素,然后再排序
代码
// 使用辅助数组来实现
vector<int> FuZhu(vector<int> a,int k) {
vector<int> result;
if(a.size() < k || k == 0) return result;
if (a.empty()) {
return result;
}
result.push_back(a[0]);
for (int i = 1; i < a.size(); i++) {
if (result.size() == k) {
sort(result.begin(), result.end());
if (a[i] < *(result.end()-1)) {
result.pop_back();
result.push_back(a[i]);
}
} else {
result.push_back(a[i]);
}
}
//时间复杂度
return result;
}
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
return FuZhu(input, k);
}
2.方法二:借助快速排序找到k的位置
思想
快速排序可以保证k左边的都小,右边都大,当基准元素位置==k个数时,输出前k个即可。
不用排两边,只要照着k在的那一侧即可
代码
intOnce(vector<int>&a,int start,intend){
int mark = start;
int tmp =0;
for(int i = start +1; i <=end; i++){
if(a[start]> a[i]){
mark++;
tmp = a[i];
a[i]= a[mark];
a[mark]= tmp;
}
}
tmp = a[mark];
a[mark]= a[start];
a[start]= tmp;
return mark;
}
void kuaisu(vector<int>&a,int k,int start,intend){
int i =Once(a, start,end);
if(k == i){
return;
}
// 这次分完位置在i,和k去比较
if(i > k){
kuaisu(a, k,0, i -1);
}
else{
kuaisu(a, k, i +1,end);
}
}
// 借鉴快速排序实现
vector<int>GetLeastNumbers_Solution(vector<int> input,int k){
//找到k的位置就行
vector<int> result;
if(k > input.size())return result;// 找不到k位置
if(input.empty()){
return result;
}
// 让我们开始快速排序
kuaisu(input, k,0, input.size()-1);
// 把前k个数存入result
for(int i =0; i < k; i++){
result.push_back(input[i]);
}
return result;
}
以上是关于剑指offer二十九---最小的k个数的主要内容,如果未能解决你的问题,请参考以下文章
剑指 Offer 45. 把数组排成最小的数 剑指 Offer 61. 扑克牌中的顺子 剑指 Offer 40. 最小的k个数