首页 > 其他 > 详细

剑指 Offer 40. 最小的k个数

时间:2021-02-07 09:57:23      阅读:27      评论:0      收藏:0      [点我收藏+]

题意

如题所示

思路

  • 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;
    }
};

剑指 Offer 40. 最小的k个数

原文:https://www.cnblogs.com/MartinLwx/p/14383654.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!