【Data Structure & Algorithm】 查找最小的k个元素
查找最小的k个元素
题目:输入n个整数,输出其中最小的k个。
例如输入1, 2, 3, 4, 5, 6, 7和8这八个数字,则最小的4个数字为1, 2, 3和4.
分析:这道题最简单的思路是把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn),这当然还有更快的思路。
可以开辟一个长度为k的数组,每次从输入的n个整数中读入一个数,如果数组中已经插入的元素个数少于k个,则将读入的整数直接放到数组中。否则长度为k的数组已经满了,不能再往数组里插入元素,只能替换了。如果读入的这个整数比数组中已有的k个整数的最大值要小,则用读入的这个整数替换这个最大值;如果读入的整数比数组中已有k个整数的最大值还要大,则读入的这个整数不可能是最小的k个整数之一,抛弃这个整数。这种思路相当于只要排序k个整数,因此时间复杂度可以降到O(n+nlogk)。通常情况下k要远小于n,所以这种办法要优于前面的思路。
另外,从上面的分析,当长度为k的数组已经满了之后,如果需要替换,每次替换的都是数组中的最大值。在常用的数据结构中,能够在O(1)时间里得到最大值的数据结构为最大堆,因此可以用堆(heap)来代替数组。此外,在STL中的set和multiset都有堆的实现,直接调用即可。
#include<set>
#include<vector>
#include<iostream>
using namespace std; typedef multiset<int, greater<int>>IntHeap; //////////////////////////////////////////////////
// find k least numbers in a vector
//////////////////////////////////////////////////
void FindKLeastNumbers
(
constvector<int> & data, //avector of data
IntHeap&leastNumbers, //k least numbers,output
unsignedint k
)
{
leastNumbers.clear(); if(k==0|| data.size()<k)
return;
vector<int>::const_iteratoriter = data.begin();
for(;iter!=data.end(); ++iter)
{
//ifless than k numbers was inserted into leastNumbers
if((leastNumbers.size())<k)
leastNumbers.insert(*iter); //leastNumberscontains k numbers and it's full now
else
{
//firstnumber in leastNumbers is the greatest one
IntHeap::iteratoriterFirst = leastNumbers.begin(); //ifis less than the previous greatest number
if(*iter<*(leastNumbers.begin()))
{
//replacethe previous greatest number
leastNumbers.erase(iterFirst);
leastNumbers.insert(*iter);
}
}
}
}
【Data Structure & Algorithm】 查找最小的k个元素的更多相关文章
- 【编程题目】查找最小的 k 个元素
5.查找最小的 k 个元素(数组)题目:输入 n 个整数,输出其中最小的 k 个.例如输入 1,2,3,4,5,6,7 和 8 这 8 个数字,则最小的 4 个数字为 1,2,3 和 4. 算法里面学 ...
- 查找最小的k 个元素之C#算法实现
紧接着上一篇微软编程面试100题,这次想解决的是查找最小的K个元素,题目是:输入n 个整数,输出其中最小的k 个.例如输入1,2,3,4,5,6,7 和8 这8 个数字,则最小的4 个数字为1,2,3 ...
- 查找最小的K个元素,使用最大堆。
查找最小的K个元素,使用最大堆,具体代码如下: #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace st ...
- 程序员面试50题(1)—查找最小的k个元素[算法]
题目:输入n个整数,输出其中最小的k个.例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数 ...
- 5.查找最小的k个元素[Kmin]
[题目] 输入n个整数,输出其中最小的k个. 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. [分析] 这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前 ...
- 查找最小的k个元素 【微软面试100题 第五题】
题目要求: 输入n个整数,输出其中最小的k个. 例如:输入1,2,3,4,5,6,7,8这8个数字,则最小的4个数字为1,2,3,4. 参考资料:剑指offer第30题. 题目分析: 解法一: 用快排 ...
- 5.查找最小的k个元素(数组)
题目: 输入n个整数,输出其中最小的k个,例如输入1,2,3,4,5,6,7,8这8个数,则最小的4个是1,2,3,4(输出不要求有序) 解: 利用快速排序的partition,算导上求第k大数的思想 ...
- 查找最小的k个元素
题目:输入n个整数,输出其中最小的k个. 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 两种思路,无非就是时间与空间的妥协. 限制空间的时候要对原数组进行排序, ...
- IT公司100题-5-查找最小的k个元素
问题描述: 输入n 个整数,输出其中最小的k 个. 例如输入8, 7, 6, 5, 4, 3, 2, 1这8 个数字,则最小的3 个数字为3, 2, 1. 分析: 时间复杂度O(nlogn)方法: ...
随机推荐
- OpenGL 与 GLSL 版本号
来自:https://github.com/mattdesl/lwjgl-basics/wiki/GLSL-Versions You can use the #version command as t ...
- 如何求文件File的字节数
[java]代码库 import java.io.*; /** * 获取文件的字节数 */ class FileInputStreamS { public static voi ...
- [转]JavaScript
javascript 1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键 <table border on ...
- linux下解压命令大全(转载)
转自:http://www.cnblogs.com/eoiioe/archive/2008/09/20/1294681.html .tar 解包:tar xvf FileName.tar打包:tar ...
- 图像处理之滤波---gabor
http://blog.csdn.net/xiaowei_cqu/article/details/24745945 小魏北大
- Java多态特性:重载和覆写的比較
Java重载: 在同一个类中 方法具有同样的名字,同样或不同的返回值,但參数不同的多个方法(參数个数或參数类型) public class MethoDemo{ public static void ...
- asp.net mvc4 登录界面
说明:开发环境 asp.net mvc4 c#语言 1.项目目录结构 2.Login控制器中 public ActionResult Index() { return View(); } 对应Inde ...
- C/C++笔记之char *与wchar_t *的相互转换
char *和wchar_t *的相互转换,可使用标准库函数 size_t mbstowcs(wchar_t *wcstr, const char *mbstr, size_t count)和size ...
- C++笔记之用户定义的转换
用户定义的转换(User-defined Conversion) 是一种将一个类类型转换为另一种类型的机制 语法 operator conversion-type-idexplicit operato ...
- FireMonkey 结构性初略分析
Delphi 下的FireMonkey,很好地实现了 DirectUI与跨平台.学习了解他,对DirectUI编程及项目的跨平台实现有一定帮助.虽然作为开发者个体,并不需要了解太多这些东西,只要求拿来 ...