zoukankan      html  css  js  c++  java
  • 数据结构-最小的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;
    }
  • 相关阅读:
    ubuntu16.04服务自启动(弹控制台)
    第十集 爱在天路唐古拉,青藏梦止长江源
    第九集 生死穿越风火山,感受尘世间轮回
    第八集 昆仑初度尘未洗,夜宿禁区五道梁
    第七集 久历风尘凡间路,终见西域玉珠峰
    第六集 飞沙走石共患难,夜扎昆仑饮圣泉
    第五集 插肩而过茶卡湖,朝发夕至格尔木
    辞职之后在家的挣扎与老爸的工作
    2018,怎么这么难,我该怎么办,我的ai和感情
    17年11月兄弟小聚
  • 原文地址:https://www.cnblogs.com/wn19910213/p/3755373.html
Copyright © 2011-2022 走看看