剑指 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 getLeastNumbers(vector& arr, int k) {
        sort(arr.begin(), arr.end());
        vector ans(arr.begin(), arr.begin() + k);
        return ans;
    }
};

方法二

class Solution {
public:
    vector getLeastNumbers(vector& arr, int k) {
        vector ans;
        if (k == 0) return ans;
        priority_queue 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;
    }
};