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

http://github.com/wanglei5205

http://cnblogs.com/wanglei5205

# 题目

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

# 思路

  • 基于Partition的思路

时间复杂度为O(n)

  • 基于红黑树的思路

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

基本思路:首先创建一个大小为k的容器,用来存储最小的k个数字;然后每次从输入的n个整数中输入一个数,如果容器中已有的数字少于k个,则直接把读入的整数放入容器;如果容器中已有k个数字,则不能再插入新的数字而只能替换已有的数字。替换的原则:如果待插入的值m比容器中的最大值n小,则m替换n;如果待插入的值m比容器中的最大值n大,则保持不变。(在k个整数中找到最大值、删除容器最大值、插入一个新的数字)

时间复杂度:O(n*logk)

# 代码

1.基于partition的思路

2.基于红黑树的思路

 // 使用红黑树实现
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
// 特殊输入
if(input.size()<=0||k>input.size()) return vector<int>(); // 定义降序排列的集合res,用于存储结果
multiset<int, greater<int> > res; // 定义遍历向量的迭代器ite,遍历向量vector
vector<int>::iterator cur_ite;
for(cur_ite = input.begin();cur_ite!=input.end();++cur_ite)
{
// 将前k个元素插入集合
if(res.size()<k)
res.insert(*cur_ite);
else
{
// 比较+删除+插入
if(*cur_ite<*(res.begin()))
{
res.erase(res.begin());
res.insert(*cur_ite);
}
}
}
return vector<int>(res.begin(),res.end());
}
};

 

[剑指offer]数组中最小的K个数,C++实现的更多相关文章

  1. 剑指 offer set 11 最小的K个数

    总结 1. 假如允许修改给定数组, 那么通过快排的子过程, 可以在 o(n) 时间复杂度内得出结果. 2. 对于海量数据和不允许修改的数据, 通过最小堆的方式更好, 通过维持一个大小为 K 的最小堆

  2. 求一个数组中最小的K个数

    方法1:先对数组进行排序,然后遍历前K个数,此时时间复杂度为O(nlgn); 方法2:维护一个容量为K的最大堆(<算法导论>第6章),然后从第K+1个元素开始遍历,和堆中的最大元素比较,如 ...

  3. 【算法】数组与矩阵问题——找到无序数组中最小的k个数

    /** * 找到无序数组中最小的k个数 时间复杂度O(Nlogk) * 过程: * 1.一直维护一个有k个数的大根堆,这个堆代表目前选出来的k个最小的数 * 在堆里的k个元素中堆顶的元素是最小的k个数 ...

  4. [算法]找到无序数组中最小的K个数

    题目: 给定一个无序的整型数组arr,找到其中最小的k个数. 方法一: 将数组排序,排序后的数组的前k个数就是最小的k个数. 时间复杂度:O(nlogn) 方法二: 时间复杂度:O(nlogk) 维护 ...

  5. 《程序员代码面试指南》第八章 数组和矩阵问题 找到无序数组中最小的k 个数

    题目 找到无序数组中最小的k 个数 java代码 package com.lizhouwei.chapter8; /** * @Description: 找到无序数组中最小的k 个数 * @Autho ...

  6. 小米笔试题:无序数组中最小的k个数

    题目描述 链接:https://www.nowcoder.com/questionTerminal/ec2575fb877d41c9a33d9bab2694ba47?source=relative 来 ...

  7. 剑指 Offer —— 数组中重复的数字

    数组中的重复数字 题目描述 牛课网链接 长度为 n 的数组里,所有数字都在 0 到 n-1 的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一 ...

  8. 剑指offer 数组中重复的数

    在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{ ...

  9. 剑指Offer——数组中只出现一次的数字

    题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 分析: 数组中一共有偶数个数.两个数字只出现过一次. 相同数异或在一起等于0,那么将所有数异或 ...

随机推荐

  1. Keepalived+Nginx实现高可用(HA)

    Keepalived+Nginx实现高可用(HA) service iptables stopchkconfig iptables offsetenforce 0/etc/selinux/config ...

  2. Elasticsearch之分词器的工作流程

    前提 什么是倒排索引? Elasticsearch之分词器的作用 Elasticsearch的分词器的一般工作流程: 1.切分关键词 2.去除停用词 3.对于英文单词,把所有字母转为小写(搜索时不区分 ...

  3. SpringMVC两种处理器适配器

    1.实现Controller接口的处理器适配器 package com.xiaostudy; import javax.servlet.http.HttpServletRequest; import ...

  4. 整数分解为若干项之和 - PAT

    深度搜索,一开始没有想到,说明基本功还是不够啊,加油 //======================================================================= ...

  5. codeforce diversity

    2017-08-25 14:59:34 writer:pprp 题意如下:给你一个串字符,再给你一个数字,表示在字符串中的各不相同的字符个数, 问你最少需要改变几个字符达到要求,不能达到要求就输出im ...

  6. 自学Java测试代码 - 简单地Student类

    2017-08-23  23:45:38 writer:pprp 写这个还蛮开心的 package test; public class Student { //创建成员变量 String name ...

  7. Java 1.7 ThreadPoolExecutor源码解析

    Java中使用线程池技术一般都是使用Executors这个工厂类,它提供了非常简单方法来创建各种类型的线程池: public static ExecutorService newFixedThread ...

  8. kotlin 记录(已弃坑)

    kotlin 有些是转载内容 使用nullable值以及空值检测 引用或函数返回值如果可能为null值,则必须显式标记nullable. (在类型后面跟一个问号表示这个对象可能为空,跟两个感叹号表示这 ...

  9. Openssl VS编译方法

    工具: 1. 编译环境win10+vs2015专业版 2. ActivePerl工具,官网下载链接:http://www.activestate.com/activeperl/downloads 3. ...

  10. JavaScript高级程序设计-读书笔记(7)

    第22章 高级技巧 1.高级函数 (1)安全的类型检测 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串. ...