剑指offer题目29:最小的K个数
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
解答思路
很快就想到了思路了,知道肯定是有个类似于排序好的数组去存储数据,但是还是做了一会儿才成功。
- 不知道红黑树的存在,写插入排序算法不熟悉,最好还是一个个比对。
- 没有考虑到边界的条件,例如说k是小于1或者大于数组的本身,又或者数组是空的。
最优解就是利用红黑树去存储最小数据。
实现代码
// -----最优解-------
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
int len=input.size();
if(len<=0||k>len) return vector<int>();
//仿函数中的greater<T>模板,从大到小排序
multiset<int, greater<int> > leastNums;
vector<int>::iterator vec_it=input.begin();
for(;vec_it!=input.end();vec_it++)
{
//将前k个元素插入集合
if(leastNums.size()<k)
leastNums.insert(*vec_it);
else
{
//第一个元素是最大值
multiset<int, greater<int> >::iterator greatest_it=leastNums.begin();
//如果后续元素<第一个元素,删除第一个,加入当前元素
if(*vec_it<*(leastNums.begin()))
{
leastNums.erase(greatest_it);
leastNums.insert(*vec_it);
}
}
}
return vector<int>(leastNums.begin(),leastNums.end());
}
};
// ---- 我的渣渣答案-----
class Solution {
public:
vector<int> smallArr;
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
if(k > input.size() || input.empty() || k <= 0) {
return smallArr;
}
int i = 0;
while(i < input.size()) {
int size = smallArr.size();
int number = input[i];
if(smallArr.empty()) {
smallArr.push_back(number);
} else if(size < k || smallArr[size - 1] > number) {
// 1. 数组没空
// 2. 比最大的要小
InsertArray(number, k);
}
i++;
}
return smallArr;
}
// 学识短浅不知道有红黑树,就知道这东西和插入排序很有关联,但是写插入排序的很麻烦,于是用了最蠢的一个个比对
void InsertArray(int number, int k) {
int s = smallArr[0];
int index = 0;
if(number > s) {
int b;
int i = 1;
while(i < smallArr.size()) {
b = smallArr[i];
if(number >= s && number <= b) {
break;
}
i++;
}
index = i;
}
smallArr.insert(smallArr.begin()+index, number);
if(smallArr.size() > k) {
smallArr.pop_back();
}
}
};
作者:大傻逼
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号