• 数据结构-最小的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;
    }
  • 相关阅读:
    leetcode------Palindrome Number
    leetcode------Minimum Depth of Binary Tree
    leetcode------Binary Tree Level Order Traversal II
    leetcode------Plus One
    leetcode------Plus One
    leetcode------Min Stack
    leetcode------Binary Tree Level Order Traversal
    递归树与非递归树的不同实现【转载,个人感觉写的比较好的一篇,值得去思考】
    leetcode------Compare Version Numbers
    leetcode------Majority Element
  • 原文地址:https://www.cnblogs.com/wn19910213/p/3755373.html
Copyright © 2020-2023  润新知