最大/小的K个数问题

把平时遇到的一些笔试面试题记录下来,收集在一起。

找出最大/小的K个数

老生常谈的一个题目了,方法都是先建立大小为K的最大/小堆,每次拿出一个数与堆顶元素比较,时间复杂度为O(1),然后重建堆,时间复杂度为O(log K)。对于N个数,总共的时间复杂度为O(Nlog K)。

使用STL能够很方便的实现该功能,代码如下:

//最大k个数
typedef multiset<int, greater<int>> intSet;
typedef multiset<int, greater<int>>::iterator setIterator;
void GetLeastNumbers(const vector<int>& data, intSet& leastNumbers,int k)
{
	leastNumbers.clear();
	if(k<1 || data.size()<k)
		return;
	vector<int>::const_iterator iter=data.begin();
	for(;iter!=data.end();++iter)
	{
		if((leastNumbers.size())<k)
			leastNumbers.insert(*iter);
		else
		{
			setIterator iterGreatest=leastNumbers.begin();
			if(*iter<*(leastNumbers.begin()))
			{
				leastNumbers.erase(iterGreatest);
				leastNumbers.insert(*iter);
			}
		}
	}
}


你可能感兴趣的:(算法,面试题)