题解 | #最小的K个数#

最小的K个数

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

#include <queue>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param input int整型vector
     * @param k int整型
     * @return int整型vector
     */

    void adjuct(vector<int>& arr,int len, int index) {
        //判断是不是父节点
        while (index <= len / 2 - 1) {
            //如果是,则判断只有左孩子还是,有两个孩子
            //有两个孩子
            if (index * 2 + 2 <= len - 1) {
                index = arr[index * 2 + 1] < arr[index * 2 + 2] ? index * 2 + 1 : index * 2 + 2;

            } else { //有一个孩子
                index = index * 2 + 1;
            }

            if (arr[index] < arr[(index + 1) / 2 - 1]) {
                swap(arr[index], arr[(index + 1) / 2 - 1]);
            } else {
                break;
            }
        }

    }
    vector<int> GetLeastNumbers_Solution(vector<int>& input, int k) {
        // write code here
        //错误处理
        
        if (input.size() == 0 || k <= 0)return vector<int>();

        //使用堆排序
        //1.建立堆小顶堆

        int range_father = input.size() / 2 - 1;
        for (int i = range_father; i >= 0; i--) {
            adjuct(input, input.size(), i);
        }
        //取出k个最小值
        vector<int> res;
        int target = input.size() - 1 - k;
        for (int i = input.size() - 1; i > target; i--) {
            
            swap(input[0], input[i]);
            res.push_back(input[i]);
            adjuct(input, i, 0);
        }
        return res;
    }
};
题解一:该题可以使用堆排序,通过小顶堆,获取每k个最小的值,时间复杂度是O(nlogn),空间复杂度是O(1)。



全部评论

相关推荐

点赞 评论 收藏
分享
落叶随风呀:学校不好就放两栏,专业能力往前移, 政治面貌不是党员不如不写,籍贯湖南衡阳,或者湖南,浅尝辄止 基本信息排版不够美观,没有对齐 简历上花里胡哨的东西去掉 项目我不评价,因为我能力有限,且对mcu了解不足 但是这份简历掌握的水平,你可以海投试试,工作没问题但是工资应该不会高,因为搞mcu的小公司多
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客企业服务