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

本文介绍两种高效算法来寻找一组整数中的最小K个数:一种基于Partition算法,时间复杂度为O(n);另一种利用红黑树结构,时间复杂度为O(n*logk)。通过具体代码实现展示了这两种算法的具体操作过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

http://github.com/wanglei5205

http://cnblogs.com/wanglei5205

# 题目

      输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4

# 思路

image

  • 基于Partition的思路

     时间复杂度为O(n)

 

  • 基于红黑树的思路

  辅助容器:定义用于遍历向量的辅助容器--迭代器ite;定义用于存储结果的辅助容器--多重集合res。

       基本思路:首先创建一个大小为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         // 定义降序排列的集合res,用于存储结果
  9         multiset<int, greater<int> > res;
 10 
 11         // 定义遍历向量的迭代器ite,遍历向量vector
 12         vector<int>::iterator cur_ite;
 13         for(cur_ite = input.begin();cur_ite!=input.end();++cur_ite)
 14         {
 15             // 将前k个元素插入集合
 16             if(res.size()<k)
 17                 res.insert(*cur_ite);
 18             else
 19             {
 20                 // 比较+删除+插入
 21                 if(*cur_ite<*(res.begin()))
 22                 {
 23                     res.erase(res.begin());
 24                     res.insert(*cur_ite);
 25                 }
 26             }
 27         }
 28         return vector<int>(res.begin(),res.end());
 29     }
 30 };

 

转载于:https://www.cnblogs.com/wanglei5205/p/8824016.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值