堆——算法专项刷题(九)
admin
2024-04-20 05:41:35
0

九、堆

9.1数据流的第K大数值

设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。

请实现 KthLargest 类:

  • KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。
  • int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。

示例:

输入:

  • [“KthLargest”, “add”, “add”, “add”, “add”, “add”]
  • [[3, [4, 5, 8, 2]], [3], [5], [10], [9], [4]]
  • 输出:
  • [null, 4, 5, 5, 8, 8]

解释:

  • KthLargest kthLargest = new KthLargest(3, [4, 5, 8, 2]);
  • kthLargest.add(3); // return 4
  • kthLargest.add(5); // return 5
  • kthLargest.add(10); // return 5
  • kthLargest.add(9); // return 8
  • kthLargest.add(4); // return 8

提示:

  • 1 <= k <= 10^4
  • 0 <= nums.length <= 10^4
  • -10^4 <= nums[i] <= 10^4
  • -10^4 <= val <= 10^4
  • 最多调用 add 方法 10^4 次
  • 题目数据保证,在查找第 k 大元素时,数组中至少有 k 个元素

思路:优先队列,维护一个k大小的队列,队列第一个元素就是第k大的元素

class KthLargest {int idx;PriorityQueue queue;public KthLargest(int k, int[] nums) {queue = new PriorityQueue<>();idx = k;for (int num : nums) {queue.offer(num);}while (queue.size() > k){queue.poll();}}public int add(int val) {queue.offer(val);while(queue.size() > idx) queue.poll();return  queue.peek();}
}

9.2 出现频率最高的k个数字

原题链接

给定一个整数数组 nums 和一个整数 k ,请返回其中出现频率前 k 高的元素。可以按 任意顺序 返回答案。

示例 1:

  • 输入: nums = [1,1,1,2,2,3], k = 2
  • 输出: [1,2]

提示:

  • 1 <= nums.length <= 10^5
  • k 的取值范围是 [1, 数组中不相同的元素的个数]
  • 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

**思路:**使用map统计每个数出现的次数,借助优先级队列实现小顶堆,维护k大小的窗口

注意点: 需要自定义排序规则

class Solution {public int[] topKFrequent(int[] nums, int k) {Map map = new HashMap<>();for (int num : nums) {map.put(num,map.getOrDefault(num,0)+1);}PriorityQueue queue = new PriorityQueue<>((a,b) -> a[1] - b[1]);for(int key : map.keySet()){int value = map.get(key);if(queue.size() == k){if(queue.peek()[1] < value){queue.poll();queue.offer(new int[]{key,value});}}else{queue.offer(new int[]{key,value});}}int[] res = new int[k];for (int i = 0; i < k; i++) {res[i] = queue.poll()[0];}return res;}
}

9.3和最小的k个数对

给定两个以升序排列的整数数组 nums1 和 nums2 , 以及一个整数 k 。

定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。

请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。

示例 1:

输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3

输出: [1,2],[1,4],[1,6]

解释: 返回序列中的前 3 对数:

[1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]

提示:

  • 1 <= nums1.length, nums2.length <= 10^4
  • -10^9 <= nums1[i], nums2[i] <= 10^9
  • nums1, nums2 均为升序排列
  • 1 <= k <= 1000

思路: 优先级队列,将两个数组的下标存入数组中,利用优先级队列对每一数对之和进行从小到大的排序

注意点: 由于可能有重复数字,因此使用数组下标代替数值

class Solution {public List> kSmallestPairs(int[] nums1, int[] nums2, int k) {PriorityQueue queue = new PriorityQueue<>( (a,b) ->{return (nums1[a[0]] + nums2[a[1]]) - (nums1[b[0]] + nums2[b[1]]);});int n = nums1.length;int m = nums2.length;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {queue.offer(new int[]{i,j});}}List> res = new ArrayList<>();for (int i = 0; i < k; i++) {List list = new ArrayList<>();int[] poll = queue.poll();// 防止空指针异常if(poll == null) break;list.add(nums1[poll[0]]);list.add(nums2[poll[1]]);res.add(list);}return res;}
}

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...