【程序员面试金典】面试题 17.14. 最小K个数

这篇具有很好参考价值的文章主要介绍了【程序员面试金典】面试题 17.14. 最小K个数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目描述

描述:设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

示例:

输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]

提示:

0 <= len(arr) <= 100000
0 <= k <= min(100000, len(arr))

解题思路

思路:最直观的想法是,排序。

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

扩展:最大堆。最小的k个数,那么就可以维持一个大小为k的最大堆,先填充k个数到最大堆中,然后再依次遍历后面的数,当当前数小于最大堆堆顶则将堆顶元素弹出来并将当前元素加入堆中,最后再把最大堆的元素逐个加入结果数组中。

class Solution 
{
public:
    vector<int> smallestK(vector<int>& arr, int k) 
    {
        //排除k为0
        if(k==0)
            return {};
        //优先队列 默认大根堆
        priority_queue<int> pq(arr.begin(),arr.begin()+k);
        //插入大根堆
        for(int i=k;i<arr.size();i++)
        {
            //如果当前元素小于堆顶元素则弹出堆顶元素再插入当前元素
            if(arr[i]<pq.top())
            {
                pq.pop();
                pq.push(arr[i]);
            }
        }
        vector<int> res;
        //将大根堆转换为vector
        while(!pq.empty())
        {
            res.push_back(pq.top());
            pq.pop();
        }
        return res;
    }
};

总结:对于C++中堆的操作方法:top获取堆顶元素,push压入元素,pop弹出元素,empty判断是否为空。将vector转换为堆使用priority_queue<int> pq(arr.begin(),arr.begin()+k),但是将堆转换为vector不可以直接转换。文章来源地址https://www.toymoban.com/news/detail-506639.html

到了这里,关于【程序员面试金典】面试题 17.14. 最小K个数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【程序员面试金典】面试题 17.26. 稀疏相似度

    描述:两个(具有不同单词的)文档的交集(intersection)中元素的个数除以并集(union)中元素的个数,就是这两个文档的相似度。例如,{1, 5, 3} 和 {1, 7, 2, 3} 的相似度是 0.4,其中,交集的元素有 2 个,并集的元素有 5 个。给定一系列的长篇文档,每个文档元素各不相同,并与一个

    2024年02月12日
    浏览(26)
  • 【程序员面试金典】面试题 17.23. 最大黑方阵

    描述:给定一个方阵,其中每个单元(像素)非黑即白。设计一个算法,找出 4 条边皆为黑色像素的最大子方阵。 返回一个数组 [r, c, size] ,其中 r, c 分别代表子方阵左上角的行号和列号,size 是子方阵的边长。若有多个满足条件的子方阵,返回 r 最小的,若 r 相同,返回 c 最小

    2024年02月12日
    浏览(27)
  • 【程序员面试金典】面试题 17.19. 消失的两个数字

    描述:给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗? 以任意顺序返回这两个数字均可。 示例 1: 示例 2: 提示: nums.length = 30000 思路:最直观的想法是,位运算。消失的两个数字和只出现一次的两个元素,本质

    2024年02月12日
    浏览(33)
  • 【程序员面试金典】面试题 17.21. 直方图的水量

    描述:给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方图,在这种情况下,可以接 6 个单位的水(蓝色部分表示水)。 感谢 Marcos 贡献此图。 示例: 思路:最直观的想

    2024年02月11日
    浏览(31)
  • 《程序员面试金典(第6版)面试题 16.10. 生存人数(前缀和思想)

    给定 N 个人的出生年份和死亡年份,第 i 个人的出生年份为 birth[i],死亡年份为 death[i],实现一个方法以计算生存人数最多的年份。 你可以假设所有人都出生于 1900 年至 2000 年(含 1900 和 2000 )之间。如果一个人在某一年的任意时期处于生存状态,那么他应该被纳入那一年的

    2024年02月02日
    浏览(35)
  • 《程序员面试金典(第6版)》 面试题 08.11. 硬币(动态规划,组合问题,C++)

    硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007) 示例1: 输入: n = 5 输出:2 解释: 有两种方式可以凑成总金额: 5=5 5=1+1+1+1+1 示例2: 输入: n = 10 输出:4 解释: 有四种方式可以凑成总金额: 1

    2023年04月08日
    浏览(38)
  • 78-快速排序练习-LeetCode面试题17.14.最小k个数

    题目 设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。 示例: 输入: arr = [1,3,5,7,2,4,6,8], k = 4 输出: [1,2,3,4] 提示:     0 = len(arr) = 100000     0 = k = min(100000, len(arr)) 思路 注意到题目要求「任意顺序返回这 k 个数即可」,因此我们只需要确保前 k 小的

    2023年04月12日
    浏览(19)
  • 【LeetCode力扣】面试题 17.14. 最小K个数(top-k问题)

    目录 1、题目介绍 2、解题思路 2.1、优先队列解法 2.2、top-k问题解法 原题链接: 面试题 17.14. 最小K个数 - 力扣(LeetCode)  题目要求非常简短,也非常简单,就是求一组数中的k个最小数。         如果在正常刷题过程中遇到这种题,那么这道题毋庸置疑是秒杀题,使用最

    2024年01月25日
    浏览(27)
  • 软考初级程序员上午单选题(14)

    36、下列有关目录结构的叙述中,正确的是______。 A.一个磁盘有且仅有一个根目录 B.一个磁盘可以有多个根目录 C.一个磁盘不允许有3级以上的子目录 D.一个磁盘必须有根目录和子目录 37、软件开发过程中为确保软件质量所采取的措施中,不包括______。 A.开发前应选定或

    2024年02月05日
    浏览(33)
  • 读程序员的制胜技笔记14_安全审查(下)

    1.2.2.1. 看不出来是什么?那我拒绝为你服务 1.4.1.1. 工作量证明相当消耗客户端的运算资源,对那些性能较低的设备不友好,并且它还会影响设备电池的使用寿命 1.4.1.2. 有可能会严重降低用户体验,其后果甚至比验证码的还要恶劣 3.5.2.1. 存储需求更少,性能更强,数据管理

    2024年02月05日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包