码迷,mamicode.com
首页 > 编程语言 > 详细

[剑指offer] 最小的K个数,C++实现

时间:2018-04-13 22:34:42      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:迭代   创建   order   题目   ras   border   idt   迭代器   剑指offer   

原创博文,转载请注明出处!

github地址

# 题目

      输入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 };

[剑指offer] 最小的K个数,C++实现

标签:迭代   创建   order   题目   ras   border   idt   迭代器   剑指offer   

原文地址:https://www.cnblogs.com/wanglei5205/p/8824016.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!