标签:迭代 创建 order 题目 ras border idt 迭代器 剑指offer
原创博文,转载请注明出处!
# 题目
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4
# 思路
1.基于Partition的思路
时间复杂度为O(n)
2.基于红黑树的思路
首先创建一个大小为k的容器,用来存储最小的k个数字;然后每次从输入的n个整数中输入一个数,如果容器中已有的数字少于k个,则直接把读入的整数放入容器;如果容器中已有k个数字,则不能再插入新的数字而只能替换已有的数字。替换的原则:如果待插入的值m比容器中的最大值n小,则m替换n;如果待插入的值m比容器中的最大值n大,则保持不变。(在k个整数中找到最大值、删除容器最大值、插入一个新的数字)
时间复杂度:O(n*logk)
# 代码
1.基于partition的思路
2.基于红黑树的思路
1 // 使用红黑树实现 2 class Solution { 3 public: 4 vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { 5 // 特殊输入 6 if(input.size()<=0||k>input.size()) return vector<int>(); 7 8 // 建立用于存储结果的多重集合及多重集合的最大元素的迭代器 9 multiset<int, greater<int> > res; 10 multiset<int, greater<int> >::iterator res_best; 11 12 // 遍历输入 13 vector<int>::iterator input_ite = input.begin(); // 向量迭代器 14 for(;input_ite!=input.end();input_ite++) 15 { 16 // 将前k个元素插入集合 17 if(res.size()<k) 18 res.insert(*input_ite); 19 else 20 { 21 // 多重集合中最大元素的迭代器 22 res_best = res.begin(); 23 // 比较+删除+插入 24 if(*input_ite<*(res.begin())) 25 { 26 res.erase(res_best); 27 res.insert(*input_ite); 28 } 29 } 30 } 31 return vector<int>(res.begin(),res.end()); 32 } 33 };
标签:迭代 创建 order 题目 ras border idt 迭代器 剑指offer
原文地址:https://www.cnblogs.com/wanglei5205/p/8824016.html