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


    剑指 Offer 40. 最小的k个数

    输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

    思路

    方法一:排序

    对原数组从小到大排序后取出前 k 个数即可。

    方法二:堆

    用一个大根堆实时维护数组的前 k 小值。

    方法三:快排思想

    注意,题目只需要返回最小的 k 个数字,而没有要求这 k 个数字一定是有序的。

    这个有点难,待填坑。。。

    代码

    方法一

    也可以自己手写快排,我调的库

    class Solution {
    public:
        vector<int> getLeastNumbers(vector<int>& arr, int k) {
            sort(arr.begin(), arr.end());
            vector<int> ans(arr.begin(), arr.begin() + k);
            return ans;
        }
    };
    

    方法二

    class Solution {
    public:
        vector<int> getLeastNumbers(vector<int>& arr, int k) {
            vector<int> ans;
            if (k == 0) return ans;
            priority_queue<int> q;
            for (int i = 0; i < k; ++i) {
                q.push(arr[i]);
            }
            for (int i = k; i < arr.size(); ++i) {
                if (arr[i] < q.top()) {
                    q.pop();
                    q.push(arr[i]);
                }
            }
            while (!q.empty()) {
                ans.push_back(q.top());
                q.pop();
            }
            // reverse(ans.begin(), ans.end());
            return ans;
        }
    };
    
  • 相关阅读:
    单例模式
    面向对象编程(一)
    杨辉三角形
    静态方法,Arrays类,二维数组
    数组,查找算法,二分查找法,冒泡排序,选择排序,插入排序
    万年历(二)
    循环结构
    万年历(一)
    条件结构
    类型转换,位运算符
  • 原文地址:https://www.cnblogs.com/huihao/p/16144659.html
Copyright © 2020-2023  润新知