题解 | #最小的K个数#

最小的K个数

https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf

手写小根堆,注意数组下标从1开始,因此将数组第一个元素push back到最后。

#include <climits>
#include <vector>
class Solution {
public:
    void down(vector<int> &input, int k, int sz) {
        int t = k;
        if (2 * k < sz && input[2 * k] < input[t]) t = 2 * k;
        if (2 * k + 1 < sz && input[2 * k + 1] < input[t]) t = 2 * k + 1;
        if (t != k) {
            swap(input[t], input[k]);
            down(input, t, sz);
        }
    }
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> res;
        if (!input.size() || !k || input.size() < k) return res;
        input.emplace_back(input[0]); // 使数组下标从1开始

        int sz = input.size() - 1;

        for (int i = sz / 2; i; --i) down(input, i, sz);
        for (int i = 1; i <= k; ++i) {
            res.push_back(input[1]);
            input[1] = input[sz];
            down(input, 1, sz);
            --sz;
        }
        return res;
    }
};

全部评论

相关推荐

11-15 17:19
湖南大学 Java
成果成果成果果:这是哪个公司的hr,这么离谱吗,我没见过用性别卡技术岗的,身边女性同学拿大厂offer的比比皆是
点赞 评论 收藏
分享
听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务