(剑指Offer)面试题30:最小的k个数

题目:

输入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()

你可能感兴趣的:((剑指Offer)面试题30:最小的k个数)