春招百题--堆

2024-04-07 00:52
文章标签 百题 春招

本文主要是介绍春招百题--堆,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、堆的定义

二、堆(优先队列)

堆通常用于实现优先队列(priority_queue),大顶堆相当于元素按从大到小的顺序出队的优先队列。从使用角度来看,我们可以将“优先队列”和“堆”看作等价的数据结构。

堆的常见用法:

/* 初始化堆 */
// 初始化小顶堆
priority_queue<int, vector<int>, greater<int>> minHeap;
// 初始化大顶堆
priority_queue<int, vector<int>, less<int>> maxHeap;/* 元素入堆 */
maxHeap.push(1);
maxHeap.push(3);
maxHeap.push(2);
maxHeap.push(5);
maxHeap.push(4);/* 获取堆顶元素 */
int peek = maxHeap.top(); // 5/* 堆顶元素出堆 */
// 出堆元素会形成一个从大到小的序列
maxHeap.pop(); // 5
maxHeap.pop(); // 4
maxHeap.pop(); // 3
maxHeap.pop(); // 2
maxHeap.pop(); // 1/* 获取堆大小 */
int size = maxHeap.size();/* 判断堆是否为空 */
bool isEmpty = maxHeap.empty();/* 输入列表并建堆 */
vector<int> input{1, 3, 2, 5, 4};
priority_queue<int, vector<int>, greater<int>> minHeap(input.begin(), input.end());

三、堆的常见应用

  • 优先队列:堆通常作为实现优先队列的首选数据结构,其入队和出队操作的时间复杂度均为 0(log⁡n) ,而建队操作为 0(n),这些操作都非常高效。
  • 堆排序:给定一组数据,我们可以用它们建立一个堆,然后不断地执行元素出堆操作,从而得到有序数据。
  • 获取最大的 K 个元素:这是一个经典的算法问题,同时也是一种典型应用,例如选择热度前 10 的新闻作为微博热搜,选取销量前 10 的商品等。

四、具体思路top-k问题:

  1. 初始化一个小顶堆,其堆顶元素最小。
  2. 先将数组的前 k 个元素依次入堆。
  3. 从第 k+1 个元素开始,若当前元素大于堆顶元素,则将堆顶元素出堆,并将当前元素入堆。
  4. 遍历完成后,堆中保存的就是最大的 k个元素。
/* 基于堆查找数组中最大的 k 个元素 */
priority_queue<int, vector<int>, greater<int>> topKHeap(vector<int> &nums, int k) {// 初始化小顶堆priority_queue<int, vector<int>, greater<int>> heap;// 将数组的前 k 个元素入堆for (int i = 0; i < k; i++) {heap.push(nums[i]);}// 从第 k+1 个元素开始,保持堆的长度为 kfor (int i = k; i < nums.size(); i++) {// 若当前元素大于堆顶元素,则将堆顶元素出堆、当前元素入堆if (nums[i] > heap.top()) {heap.pop();heap.push(nums[i]);}}return heap;
}

总共执行了 n 轮入堆和出堆,堆的最大长度为 k ,因此时间复杂度为 0(nlogk)。该方法的效率很高,当 k 较小时,时间复杂度趋向0(n) ;当k 较大时,时间复杂度不会超过 0(nlog⁡n) 。

另外,该方法适用于动态数据流的使用场景。在不断加入数据时,我们可以持续维护堆内的元素,从而实现最大的 k个元素的动态更新

五、习题:

215. 数组中的第K个最大元素

class Solution {
public:int findKthLargest(vector<int>& nums, int k) {//建大顶堆priority_queue<int,vector<int>,greater<int>>heap;int n=nums.size();for(int i=0;i<k;i++){heap.push(nums[i]);}for(int i=k;i<n;i++){if(nums[i]>heap.top()){heap.pop();heap.push(nums[i]);}   }return heap.top();}
};

264. 丑数 II

给你一个整数 n ,请你找出并返回第 n 个 丑数 。

丑数 就是质因子只包含 23 和 5 的正整数。

思路:如果x是丑数,则2x、3x、5x也是丑数。所以我们不妨使用一个优先队列,存储这些丑数。

每次取出堆顶元素 x,则 x 是堆中最小的丑数,由于 2x,3x,5x 也是丑数,因此将 2x,3x,5x加入堆。

上述做法会导致堆中出现重复元素的情况。为了避免重复元素,可以使用哈希集合去重,避免相同元素多次加入堆。

哈希去重:

unordered_set<long> seen;//建立哈希表
//seen.count(x)//对x元素计数。if(!seen.count(x))//x此时一个都没有
seen.insert(x);//插入到哈希表中,此时数量就为一了
class Solution {
public:int nthUglyNumber(int n) {//哈希表去重unordered_set<long> seen;vector<int>factors={2,3,5};priority_queue<long,vector<long>,greater<long>>heap;seen.insert(1L);heap.push(1L);int ugly=0;for(int i=0;i<n;i++){long curr=heap.top();heap.pop();ugly=(int)curr;for(int factor:factors){long next=curr*factor;if(!seen.count(next)){seen.insert(next);heap.push(next);}}}return ugly;}
};

另外一个方法:. - 力扣(LeetCode)

这篇关于春招百题--堆的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/881261

相关文章

算法题解记录31+++下一个排列(百题筑基)

我是蚊子码农,本次为大家带来一道“双指针”题目。 一、题目描述 题目难度:中等。 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大

算法题解记录30+++乘积最大子序列(百题筑基)

我是蚊子码农,本次为大家带来一道经典的“动态规划”问题解题思路。 一、题目描述 给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续 子数组 (该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 测试用例的答案是一个 32-位 整数。 示例 1: 输入: nums = [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2: 输入:

华为2018实习春招笔试

记录一下今天华为笔试题,表示第二第三题无压力能解决,第一题刚上来代码通过百分之十,很无语,后面直接先放着,写后面。运气来的太好?我写到40几分钟,他们好多人都结束了,这有点夸张吧,神通广大呀,他们,虽然我给他们贡献了第二题,第三题!!!,后来,第一题我直接在群里问了下,小伙伴还是很给力的助力了一波,赞!特此来记录一番! 1、 [编程|100分] 字符串重排时间限制:C/C++ 1秒,其他语言

【百度、腾讯、阿里等】+【JAVA开发实习生】+春招面试经验

基本情况介绍: 性别:lz**萌**妹子一枚 学校:本科双非、硕士985 实力:只是女生比,中等偏上一丢丢 面试公司:百度、腾讯、阿里、今日头条、美团、京东、去哪儿、CVTE、神州数码、知道创宇、intel 面试职位:web渗透测试工程师(安全方向)、JAVA开发工程师、测试开发工程师 春招结果:百度(hr通知准备三面,结果被放鸽子)、阿里(测开offer)、今日头条(测开offer)、腾讯

Dubbo常见面试题及答案汇总1000道(春招+秋招+社招)

Dubbo面试题以及答案整理【最新版】Dubbo高级面试题大全(2021版),发现网上很多Dubbo面试题都没有答案,所以花了很长时间搜集,本套Dubbo面试题大全,汇总了大量经典的Dubbo程序员面试题以及答案,包含Dubbo语言常见面试题、Dubbo工程师高级面试题及一些大厂Dubbo开发面试宝典,面试经验技巧等,应届生,实习生,企业工作过的,都可参考学习! 这套Dubbo面试题大全,希望对

Java后端Java面试题总结2021(春招+秋招+社招)

Java常见2021年最新面试题,附答案解析 01、 创建socket通讯的步骤?02、 Java 中 sleep 方法和 wait 方法的区别?03、 程序计数器(线程私有)04、 什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing)?05、 迭代器 Iterator 是什么?06、 线程的 sleep()方法和 yield()方法有什么区别?07、 Ja

网易2017春招笔试 分饼干

易老师购买了一盒饼干,盒子中一共有k块饼干,但是数字k有些数位变得模糊了,看不清楚数字具体是多少了。易老师需要你帮忙把这k块饼干平分给n个小朋友,易老师保证这盒饼干能平分给n个小朋友。现在你需要计算出k有多少种可能的数值 输入描述: 输入包括两行: 第一行为盒子上的数值k,模糊的数位用X表示,长度小于18(可能有多个模糊的数位) 第二行为小朋友的人数n 输出描述: 输出k可能的数值种数

中国星网时空信息集团春招Offer面经

本文介绍2024届春招中,中国卫星网络集团有限公司下属中国时空信息集团有限公司中,业务助理岗位1场面试的基本情况、提问问题等。   2024年04月投递了中国卫星网络集团有限公司下属中国时空信息集团有限公司中的业务助理岗位,所属部门为运营中心。当初官网允许同时投递6个志愿,我也都投了;而面试前我看工作人员发来的信息,和我当时投的志愿的信息似乎都不太一致,应该属于是调剂了。目前完成了一面、体检

中国银行信息科技运营中心、软件中心春招笔试测评面试体检全记录

本文介绍2024届春招中,中国银行下属各部门统一笔试,以及信息科技运营中心与软件中心各自的面试,以及编程能力测评、体检等相关环节的具体流程、相关信息等。   2024年04月投递了中国银行的信息科技类岗位,一共投递了4个岗位;其中进入了信息科技运营中心、软件中心以及中银基金等3个部门或子公司的后续面试流程。关于最后者,也就是中银基金,我们在之前的文章中银基金软件开发工程师春招群面记录(htt

百题纪念之1041 John's trip(欧拉回路)

题目大意: John拥有一辆新车,他想去拜访在同一个小镇上的朋友,但是他的朋友有很多且在每一条街上都有他的朋友,现在给出这些街道的信息x,y,z,(x,y是连接第z条街道的两个连接点),如果John能够不重复的经过每一条街道,如果不能,输出”Round trip does not exist.“,否则输出经过的街道的编号(按字典序最小输出)。 解题思路: 典型的求欧拉回路的方法,难点不在欧拉