• 面试题15 查找最小的 k 个元素 [数组] / (堆优化 STL O(nlogk) )[STL]


    平均复杂度 O(nlogk) 的基于快排的方法
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <stack>
    #include <algorithm>
    #define BUG cout << "here\n";
    using namespace std;
    const int N = 105;
    
    int a[N] = {4, 5, 1, 6, 2, 7, 3, 8};
    int partition(int a[], int left, int right) {
        if(left < right) {
            int l = left, r = right, x = a[l];
            while(1) {
                while(l < r && a[r] >= x) r--;
                while(l < r && a[l] <= x) l++;
                if(l >= r) break;
                swap(a[r], a[l]);
            }
            swap(a[left], a[l]);
            return l;
        }
        else return left;
    }
    void solve(int* input, int n, int k) {
        if(input == NULL || k > n || 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 < k; i++) {
            cout << input[i] << ' ';
        }
        cout << endl;
    }
    int main() {
        solve(a, 8, 5);
        return 0;
    }
    
    (堆优化 STL O(nlogk) ) 【STL】 
    #include <iostream>
    #include <string>
    #include <cstdio>
    #include <set>
    #include <vector>
    #include <functional>
    #include <algorithm>
    using namespace std;
    
    typedef multiset<int, greater<int> > intSet; /// 定义容器的
    typedef multiset<int, greater<int> >::iterator setIterator;  /// 定义迭代器的
    
    void getLastNumbers(const vector<int>& data, intSet& setK, int k) {
        setK.clear();
        if(k < 1 || data.size() < k) return;
        vector<int>::const_iterator iter = data.begin();
        for(;iter != data.end(); ++iter) {
            if(setK.size() < k) {
                setK.insert(*iter);
            }
            else {
                setIterator iter2 = setK.begin(); // 最大的位置
                if(*iter < (*iter2)) {
                    setK.erase(iter2);
                    setK.insert(*iter);
                }
            }
        }
        setIterator sit = setK.begin();
        for(;sit != setK.end(); sit++) {
            cout << *sit << ' ';
        }
        cout << endl;
    }
    int main() {
        vector<int> V;
        V.push_back(4); V.push_back(5); V.push_back(1); V.push_back(6);
        V.push_back(2); V.push_back(7); V.push_back(3); V.push_back(8);
        intSet ms;
        getLastNumbers(V, ms, 5);
        return 0;
    }
    

  • 相关阅读:
    敏捷个人2013.06月份户外活动报道:奥森健步读书分享会
    敏友的【敏捷个人】有感(16): 成为一个敏捷的人
    #敏捷个人# 每日认识101(14):成为一个敏捷个人
    4周的敏捷生活练习,你来吗?
    OKGo vs RxHttpUtils ...
    Android开发之EditText多行文本输入
    android开发中json与java对象相互转换
    android 调试崩溃Unable to instantiate application的解决方法
    Android.mk 使用说明
    几种知名开源富文本编辑器记录和对比(仅供参考)
  • 原文地址:https://www.cnblogs.com/robbychan/p/3787141.html
Copyright © 2020-2023  润新知