首页 > 编程语言 > 详细

面试题40:最小的k个数(C++)

时间:2020-03-20 12:57:44      阅读:85      评论:0      收藏:0      [点我收藏+]

题目地址https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/

题目描述

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

题目示例

示例 1:

输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]

示例 2:

输入:arr = [0,1,2,1], k = 1
输出:[0]

解题思路

传统法:题目很简单,我们先对原数组从小到大排序,然后取出k个数即可。

大根堆:使用一个大根堆(优先队列)实时维护数组的前 k小值。首先将前 k个数插入大根堆中,随后从第 k+1个数开始遍历,如果当前遍历到的数比大根堆的堆顶的数要小,则将堆顶的数弹出,然后插入当前遍历到的数。最后将大根堆里的数存入数组返回即可。

程序源码

传统法

class Solution {
public:
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        vector<int> arr1(k, 0);
        sort(arr.begin(), arr.end());
        for(int i = 0; i < k; i++) arr1[i] = arr[i];
        return arr1;
    }
};

大根堆

class Solution {
public:
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        vector<int> arr1(k, 0);
        if(k == 0) return arr1;
        priority_queue<int> que;
        for(int i = 0; i < k; i++)
        {
            que.push(arr[i]);
        }
        for(int j = k; j < arr.size(); j++)
        {
            if(que.top() > arr[j])
            {
                que.pop();
                que.push(arr[j]);
            }
        }
        for(int i = 0; i < k; i++)
        {
            arr1[i] = que.top();
            que.pop(); 
        }
        return arr1;
    }
};

面试题40:最小的k个数(C++)

原文:https://www.cnblogs.com/wzw0625/p/12530211.html

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