• 剑指 Offer 40. 最小的k个数


    题意

    如题所示

    思路

    • 1⃣️题目已经限定了数组中元素的范围,暗示可以使用桶排,最后提交用时32ms
    • 2⃣️利用快排,快排适合解决的就是最小的k个,第k个这种问题。好处是不用全部排完,只要划分的时候刚好就停在第k个元素就好。所以效率也是很高的,用时36ms

    代码一(桶排)

    class Solution {
    public:
        vector<int> getLeastNumbers(vector<int>& arr, int k) {
            vector<int> buckets(10010, 0);
            for(auto e: arr) {
                buckets[e]++;
            }
            vector<int> ans;
            for(int i=0;i<=10000;i++) {
                while(k > 0 && buckets[i] > 0) {
                    ans.emplace_back(i);
                    buckets[i]--;
                    k--;
                }
                if(k == 0) {
                    break;
                }   //如果已经找到了最小的K个数字,就提前退出
            }
            return ans;
        }
    };
    

    代码二(快排)

    class Solution {
    public:
        int partition(vector<int>& arr, int l, int r) {
            int t = arr[l];
            while(l < r) {
                while(l < r && arr[r] >= t)     r--;
                arr[l] = arr[r];
                while(l < r && arr[l] < t)      l++;
                arr[r] = arr[l];
            }
            arr[l] = t;
            return l;
        }
        void quick_sort(vector<int>&arr, int l, int r, int k) {
            if(l < r) {
                int pos = partition(arr, l, r);     //pos的含义我们可以解读为已经找到最小的pos个数
                if(pos > k) {   //大于题目要求
                    quick_sort(arr, l, pos - 1, k);
                }else if(pos < k) {     //小于题目要求
                    quick_sort(arr, pos + 1, r, k);
                }else {
                    return;
                }
            }
        }
        vector<int> getLeastNumbers(vector<int>& arr, int k) {
            quick_sort(arr, 0, arr.size() - 1, k);
            vector<int> ans;
            for(int i=0;i<k;i++) {
                ans.emplace_back(arr[i]);
            }
            return ans;
        }
    };
    
    如有转载,请注明出处QAQ
  • 相关阅读:
    交流课件
    ARC127F ±AB
    CF1566F xor-quiz
    JOISC 2016 Day 1 棋盘游戏
    dev分支和release是什么
    drf 笔记
    drf 序列化的写法 总结
    Linux系统编程
    C/C++ 网络编程
    C++提高编程
  • 原文地址:https://www.cnblogs.com/MartinLwx/p/14383654.html
Copyright © 2020-2023  润新知