题目:
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思路:
1、排序
把输入的n个整数排序,然后取前k个数;
时间复杂度:O(nlogn)
2、Partition
通过partition找到第k大的数,它的左边就是前k小的数;
时间复杂度:O(n)
3、最大堆
构建k个整数的最大堆数据结构,然后将剩余n-k个整数依次与堆顶比较,大则抛弃,小则删除堆顶并插入,最后的最大堆就是最小的k个整数;
堆是基于二叉树来实现的,因此插入和删除操作都在O(logk)时间内完成。在代码中可以通过STL中的容器来实现,如set,multiset,priority_queue等,都是基于红黑树实现的,所以是排序的。
时间复杂度:O(nlogk)
代码:
1、Partition方法
#include
using namespace std;
int Partition(int* numbers,int start,int end){
int key=numbers[start];
int i=start;
int j=end;
while(i=key)
--j;
if(in || n<=0 || k<=0)
return;
int start=0;
int end=n-1;
int index=Partition(input,start,end);
while(index!=k-1){
if(index>k-1){
end=index-1;
index=Partition(input,start,end);
}
else{
start=index+1;
index=Partition(input,start,end);
}
}
for(int i=0;i
2、最大堆/大顶堆
#include
#include
#include
using namespace std;
typedef multiset > inSet;
typedef multiset >::iterator setIterator;
void GetLeastNumbers_1(const vector &data,inSet &leastNumbers,unsigned int k){
leastNumbers.clear();
if(k<1 || data.size()::const_iterator it=data.begin();
for(;it!=data.end();it++){
if(leastNumbers.size() data(A,A+len);
inSet leastNumbers;
GetLeastNumbers_1(data,leastNumbers,k);
for(setIterator it=leastNumbers.begin();it!=leastNumbers.end();it++)
cout<<*it<<" ";
cout<
在线测试OJ:
http://www.nowcoder.com/books/coding-interviews/6a296eb82cf844ca8539b57c23e6e9bf?rp=2
AC代码:
1、Partition方法:
class Solution {
public:
int Partition(vector &data,int start,int end){
int key=data[start];
int i=start;
int j=end;
while(i=key)
j--;
if(i GetLeastNumbers_Solution(vector input, int k) {
vector output;
if(k<1 || input.size()k-1){
end=index-1;
index=Partition(input,start,end);
}
else{
start=index+1;
index=Partition(input,start,end);
}
}
for(int i=0;i
2、大顶堆:multiset
class Solution {
public:
typedef multiset > inSet;
typedef multiset >::iterator inSetIterator;
vector GetLeastNumbers_Solution(vector input, int k) {
vector output;
if(k<1 || input.size()::iterator it=input.begin();it!=input.end();it++){
if(LeastNumbers.size()
3、大顶堆:priority_queue
class Solution {
public:
typedef priority_queue,less > PQ;
vector GetLeastNumbers_Solution(vector input, int k) {
vector output;
if(k<1 || input.size()::iterator it=input.begin();it!=input.end();it++){
if(LeastNumbers.size()