数据结构-最小的K个数

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

分析:根据分析可以发现利用快速排序,在根据排序后直接输出前面的K个数。但是该方法需要更改数组的内容,在不能更改的前提下可以利用最常规的分析max的方法。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

在分析STL的set的时候发现一些以前不知道的问题:

  在C++里面set和java里面的Treeset一样是排好序的。但是C++的迭代器的set.end()返回的是该容器的size长度的数的地址,而不是最后一个数。同时要得到最后一个数字的时候可以用reverse_iterator反向迭代器的rbegin()。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*
剑指offer面试题30
*/
#include <iostream>
#include <set>

using namespace std;

void MinDig(int* a,int n,int k,set<int> &b){
    b.clear();
    if(k < 1 || n < k){
        return ;
    }

    for(int i=0;i<n;i++){
        if(b.size() < k){
            b.insert(a[i]);
        }

        else{
            set<int>::reverse_iterator iter = b.rbegin();
            if(a[i] < *(b.rbegin())){
                b.erase(*(b.rbegin()));
                b.insert(a[i]);
            }
        }
    }
}

int main()
{
    int n,k,m;
    cout << "输入:n个整数,和k个最小数的数量:" << " ";
    cin >> n >> k;

    int a[n];

    if(n >= 1){
        cout << "输入n个数字:" << " ";
        for(int i=0;i<n;i++){
            cin >> m;
            a[i] = m;
        }
    }

    set<int> b;
    MinDig(a,n, k,b);

    set<int>::iterator iter = b.begin();
    for(;iter!=b.end();++iter){
        cout << *iter << "  ";
    }
/*
    cout << endl << endl;

    set<int> c;
    c.insert(2);
    c.insert(3);
    c.insert(6);
    c.insert(5);
    c.insert(8);
    c.insert(7);
    c.insert(9);
    c.insert(4);

    set<int>::iterator iterc = c.begin();
    for(;iterc!=c.end();++iterc){
        cout << *iterc << "  ";
    }
    cout << endl << *(c.rend()) << " " << *(b.begin()) <<  endl;
*/
    return 0;
}
原文地址:https://www.cnblogs.com/wn19910213/p/3755373.html