查找最小的k个元素

原创 2013年12月03日 14:36:03

题目:输入n个整数,输出其中最小的k个。例如:输入1,2,3,4,5,6,7,8,则最小的4个数是1,2,3,4。

分析:采取一般的排序算法,如快速排序,堆排序,归并排序,等,先将这n个整数进行排序,然后再取最小的k个。那么时间复杂度为nlgn。

           我们可以从数组中取k个元素,建一个k个元素的最大堆,继续从数组里面取出元素,如果该元素大于堆中最大元素,那么舍弃,继续;如果小于,则将该元素替换掉堆中最大元素,并调整最大堆结构,维护最大堆性质不变,维护最大堆的性质,时间复杂度为lgk,那么总的时间复杂度为nlgk。这样最终堆中的k个元素即为最小的k个数。

           而STL中,set和multiset很好地实现了堆的性质,但是set中不允许存在相同的元素,而multiset则允许,那么我们采用multiset来实现最大堆。

#include "stdafx.h"
#include <vector>
#include <set>
#include <iostream>

using namespace std;

typedef multiset<int,greater<int>> IntSet;
void FindLeastKNumbers_(int a[], IntSet &leastNumbers, int nLength,int k)
{
	//a.clear();
	//如果原数组元素个数小于k,则不合题意,返回
	if(nLength < k)
		return;
	for(int i=0;i<nLength;i++)
	{
		if(leastNumbers.size()<k)
			leastNumbers.insert(a[i]);	//取前面k个元素建最大堆
		else
		{
			IntSet::iterator iterFirst = leastNumbers.begin();
			if(*iterFirst>(a[i]))
			{
				leastNumbers.erase(iterFirst);
				leastNumbers.insert(a[i]);
			}
		}
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	int a[20] = {1,2,7,9,3,6,2,9,8,10,11,17,12,18,19,16,17,14,5,20};
	IntSet heapset;
	FindLeastKNumbers_(a,heapset,20,6);
	IntSet::iterator iter = heapset.begin();
	for(;iter!=heapset.end();iter++)
		cout<<*iter<<",";
	return 0;
}

面试100题:5.查找最小的k个元素

题目: 输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7,8和4这几个数字,则最小的4个数字为1,2,3和4。 解一: /*Title: 5.求n...

5.查找最小的k个元素(数组)

查找最小的k个元素(数组) 题目:输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。 第一种方法先排序,可以用快排,然后输出...
  • woshewq
  • woshewq
  • 2013年10月06日 21:51
  • 314

查找最小的K个元素

问题描述: 输入n个整数,输出其中最小的k个。 例如:输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。 解决方案: 用数组来存储这n个数,遍历前k个树,...

查找最小的k个元素

题目为输入n个元素找出这n个元素中最小的k个元素:如n=8,元素依次为1 2 3 4 5 6 7 8 则小的4的元素为1 2 3 4 下面上代码,解决方法见解题报告 /* 解题报告: 1、最简单的...
  • Unimen
  • Unimen
  • 2011年09月22日 14:30
  • 752

5.查找最小的k个元素

题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就...

程序员面试题精选100题(05)-查找最小的k个元素

http://zhedahht.blog.163.com/blog/static/2541117420072432136859/ 题目:输入n个整数,输出其中最小的k个。 例如输入1,...
  • ZCSYLJ
  • ZCSYLJ
  • 2011年09月28日 13:49
  • 425

查找n个数中最小的k个元素

/* 求n个数中最小的k个元素 * 用堆排序:时间复杂度为O(nlgk) */ #include /* 求左右叶子、父结点的宏定义 */ #define LEFT(i) ((i) * 2) ...

第5题:查找最小的K个元素

欢迎转载,转载请务必注明出处:http://blog.csdn.net/alading2009/article/details/44752297第5题:输入n个整数,输出其中最小的K个。(数组) 例...

【从零单排之微软面试100题系列】05之查找最小的k个元素

本题目选自July大神博客系列【微软面试100题】:july大神,该系列我主要用来记录我的学习笔记。 题目描述:输入n个整数,输出其中最小的k个(k   分析思路:(本题亦见于《剑指offe...

第五题(查找最小的k 个元素)

5.查找最小的k 个元素 题目:输入n 个整数,输出其中最小的k 个。 例如输入1,2,3,4,5,6,7 和8 这8 个数字,则最小的4 个数字为1,2,3 和4。 思路:选择排序,fuz...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:查找最小的k个元素
举报原因:
原因补充:

(最多只允许输入30个字)