Hot100之堆
我们的PriorityQueue默认为最小堆,堆顶总是为最小
215数组中的第K个最大元素
题目

思路解析
暴力解法(不符合时间复杂度)
题目要求我们找到「数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素」。「数组排序后的第 k 个最大的元素」换句话说:从右边往左边数第 k 个元素(从 1 开始),那么从左向右数是第几个呢,我们列出几个找找规律就好了。
一共 6 个元素,找第 2 大,下标是 4;
一共 6 个元素,找第 4 大,下标是 2。
因此升序排序以后,目标元素的下标是 N−k,这里 N 是输入数组的长度
Arrays.sort(nums);
return nums[nums.length - k];
优先队列解法(堆)
我们维护一个数量为K的优先队列
我们的PriorityQueue默认为最小堆,堆顶总是为最小
所以我们一次遍历,每次数量大于K的时候踢出最小的
这样子我们遍历完后,我们就留下来了k个最大的值,第一个堆顶元素就是第K个最大的元素
最小堆的进一步优化
当我们的堆里元素为K个时,此时我们的要添加的num小于堆里面的最小值
我们可以不添加直接continue跳过
为什么一定要堆里面元素个数到k个的时候呢?
因为要是我们的数组元素总个数==K的时候
我们按那个跳过逻辑来弄,我们示例【2,1】,k=2
我们for循环会导致我们的元素【2】进去了堆,但是我们的元素【1】没进去堆,导致漏添加了元素


代码
暴力解法(不符合时间复杂度)
class Solution {public int findKthLargest(int[] nums, int k) {Arrays.sort(nums);return nums[nums.length - k];}}
优先队列解法(堆)
class Solution {public int findKthLargest(int[] nums, int k) {PriorityQueue<Integer> heap=new PriorityQueue<>();for(int num:nums){heap.add(num);if(heap.size()>k){heap.poll();} }return heap.peek();}}
最小堆的进一步优化
class Solution {public int findKthLargest(int[] nums, int k) {PriorityQueue<Integer> heap=new PriorityQueue<>();for(int num:nums){if(heap.size()==k&&num<heap.peek())continue;heap.add(num);if(heap.size()>k){heap.poll();} }return heap.peek();}}
347前K个高频元素
题目

思路解析
首先我们把所有的值到放到Map结构里面
然后我们把这个Map结构map.entrySet()弄到Map结构里面
弄一个小顶堆,我们根据value来进行排序,正序,从小到大
Set<Map.Entry<Integer, Integer>> entries = map.entrySet();// 根据map的value值正序排,相当于一个小顶堆
PriorityQueue<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>((o1, o2)
-> o1.getValue() - o2.getValue());
我们把EntrySet结构加入到优先队列,他会按照value大小,正序,从小到大排序
for (Map.Entry<Integer, Integer> entry : entries) {queue.offer(entry);if (queue.size() > k) {queue.poll();}}
遍历顺序
我们因为是小顶堆,但是我们最前面的一个是我们的频率最大的值
所以我们result【】数组要倒序加入我们的值
for (int i = k - 1; i >= 0; i--) {result[i] = queue.poll().getKey();}
代码
class Solution {public int[] topKFrequent(int[] nums, int k) {int[] result = new int[k];//将数组的数放到Map里HashMap<Integer, Integer> map = new HashMap<>();for (int num : nums) {map.put(num, map.getOrDefault(num, 0) + 1);}Set<Map.Entry<Integer, Integer>> entries = map.entrySet();// 根据map的value值正序排,相当于一个小顶堆PriorityQueue<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>((o1, o2) -> o1.getValue() - o2.getValue());for (Map.Entry<Integer, Integer> entry : entries) {queue.offer(entry);if (queue.size() > k) {queue.poll();}}for (int i = k - 1; i >= 0; i--) {result[i] = queue.poll().getKey();}return result;}
}
295数据流的中位数
题目


思路解析
left最大堆和right最小堆的意义
中位数把这 6 个数均分成了左右两部分,一边是 left=[1,2,3],另一边是 right=[4,5,6]。
我们要计算的中位数,就来自 left 中的最大值,以及 right 中的最小值
随着 addNum 不断地添加数字,我们需要:
1.保证 left 的大小和 right 的大小尽量相等。规定:在有奇数个数时,left 比 right 多 1 个数。
2.保证 left 的所有元素都小于等于 right 的所有元素。
只要时时刻刻满足以上两个要求(满足中位数的定义),我们就可以用 left 中的最大值以及 right 中的最小值计算中位数
分类讨论
如果当前 left 的大小和 right 的大小相等(并下一步往right添加元素)
如果添加的数字 num 比较大,比如添加 7,那么把 7 加到 right 中。
现在 left 比 right 少 1 个数,不符合前文的规定,所以必须把 right 的最小值从 right 中去掉,添加到 left 中。如此操作后,可以保证 left 的所有元素都小于等于 right 的所有元素。
如果添加的数字 num 比较小,比如添加 0,那么把 0 加到 left 中。
这两种情况可以合并:无论 num 是大是小,都可以先把 num 加到 right 中,然后把 right 的最小值从 right 中去掉,并添加到 left 中。
如果当前 left 比 right 多 1 个数(并下一步往left添加元素)
如果添加的数字 num 比较大,比如添加 7,那么把 7 加到 right 中。
如果添加的数字 num 比较小,比如添加 0,那么把 0 加到 left 中。现在 left 比 right 多 2 个数,不符合前文的规定,所以必须把 left 的最大值从 left 中去掉,添加到 right 中。如此操作后,可以保证 left 的所有元素都小于等于 right 的所有元素。
这两种情况可以合并:无论 num 是大是小,都可以先把 num 加到 left 中,然后把 left 的最大值从 left 中去掉,并添加到 right 中
总结
我们left是最大堆
我们right是最小堆
left.size()==right.size()的情况
然后我们往right添加元素,然后right是最小堆,我们让right中元素的最小值移动到left,变成left.size()>right.size()的情况
此时就是left.size()>right.size()的情况
我们往left添加元素,然后left是最大堆,我们让left中元素的最大值移动到right,这样子又变成了元素个数相等的情况
如果我们的left.size()>right.size(),因为我们的逻辑让left中的元素只能比right中最多多一个
所以此时left的最大值就是中位数
如果我们的left.size()==right.size(),我们的中位数是【(left的最大值)+(right的最小值)】/2.0
代码
class MedianFinder {//最大堆private final PriorityQueue<Integer> left=new PriorityQueue<>((a,b)->b-a);//最小堆private final PriorityQueue<Integer> right=new PriorityQueue<>();public MedianFinder() {}public void addNum(int num) {if(left.size()==right.size()){//两个堆内元素个数相等的情况,我们往right添加元素//然后弹出right的最小值加入到left里面right.offer(num);left.offer(right.poll());}else{//当left的元素>right的元素,我们往left添加元素//然后弹出left的最大值加入到right里面left.offer(num);right.offer(left.poll());} }public double findMedian() {if(left.size()>right.size()){return left.peek();}return(left.peek()+right.peek())/2.0;}
}/*** Your MedianFinder object will be instantiated and called as such:* MedianFinder obj = new MedianFinder();* obj.addNum(num);* double param_2 = obj.findMedian();*/
相关文章:
Hot100之堆
我们的PriorityQueue默认为最小堆,堆顶总是为最小 215数组中的第K个最大元素 题目 思路解析 暴力解法(不符合时间复杂度) 题目要求我们找到「数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素」。「数组排序后的第 k …...
KNIME:开源 AI 数据科学
KNIME(Konstanz Information Miner)是一款开源且功能强大的数据科学平台,由德国康斯坦茨大学的软件工程师团队开发,自2004年推出以来,广泛应用于数据分析、数据挖掘、机器学习和可视化等领域。以下是对KNIME的深度介绍…...
Office / WPS 公式、Mathtype 公式输入花体字、空心字
注:引文主要看注意事项。 1、Office / WPS 公式中字体转换 花体字 字体选择 “Eulid Math One” 空心字 字体选择 “Eulid Math Two” 2、Mathtype 公式输入花体字、空心字 2.1 直接输入 花体字 在 mathtype 中直接输入 \mathcal{L} L \Large \mathcal{L} L…...
[HOT 100] 2824. 统计和小于目标的下标对数目
文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 2824. 统计和小于目标的下标对数目 - 力扣(LeetCode) 2. 题目描述 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 target ,请你…...
建表注意事项(2):表约束,主键自增,序列[oracle]
没有明确写明数据库时,默认基于oracle 约束的分类 用于确保数据的完整性和一致性。约束可以分为 表级约束 和 列级约束,区别在于定义的位置和作用范围 复合主键约束: 主键约束中有2个或以上的字段 复合主键的列顺序会影响索引的使用,需谨慎设计 添加…...
Ubuntu20.04 磁盘空间扩展教程
Ubuntu20.04 磁盘空间扩展教程_ubuntu20 gpart扩容-CSDN博客文章浏览阅读2w次,点赞38次,收藏119次。执行命令查看系统容量相关的数据:df -h当前容量为20G,已用18G(96%),可用844M,可用…...
冯诺依曼体系架构和操作系统的概念
1.冯诺依曼体系架构 计算机的硬件大部分都遵循冯诺依曼体系架构,其图示如下 这里的存储器指的是内存,是一种断电易失的设备。 速度快 而磁盘,是一种永久存储的设备,其属于外设既是输出设备又是输入设备。速度慢 而运算器是一种…...
OpenGL学习笔记(六):Transformations 变换(变换矩阵、坐标系统、GLM库应用)
文章目录 向量变换使用GLM变换(缩放、旋转、位移)将变换矩阵传递给着色器坐标系统与MVP矩阵三维变换绘制3D立方体 & 深度测试(Z-buffer)练习1——更多立方体 现在我们已经知道了如何创建一个物体、着色、加入纹理。但它们都还…...
Linux第105步_基于SiI9022A芯片的RGB转HDMI实验
SiI9022A是一款HDMI传输芯片,可以将“音视频接口”转换为HDMI或者DVI格式,是一个视频转换芯片。本实验基于linux的驱动程序设计。 SiI9022A支持输入视频格式有:xvYCC、BTA-T1004、ITU-R.656,内置DE发生器,支持SYNC格式…...
测试工程师的DS使用指南
目录 引言DeepSeek在测试设计中的应用 2.1 智能用例生成2.2 边界值分析2.3 异常场景设计DeepSeek在自动化测试中的应用 3.1 脚本智能转换3.2 日志智能分析3.3 测试数据生成DeepSeek在质量保障体系中的应用 4.1 测试策略优化4.2 缺陷模式预测4.3 技术方案验证DeepSeek在测试效能…...
Qt常用控件 输入类控件
文章目录 1.QLineEdit1.1 常用属性1.2 常用信号1.3 例子1,录入用户信息1.4 例子2,正则验证手机号1.5 例子3,验证输入的密码1.6 例子4,显示密码 2. QTextEdit2.1 常用属性2.2 常用信号2.3 例子1,获取输入框的内容2.4 例…...
linux运行级别
运行级别:指linux系统在启动和运行过程中所处的不同的状态。 运行级别之间的切换:init (级别数) 示例: linux的运行级别一共有7种,分别是: 运行级别0:停机状态 运行级别1:单用户模式/救援模式…...
数据结构课程设计(四)校园导航
4 校园导航 4.1 需求规格说明 【问题描述】 一个学校平面图,至少包括10个以上的场所,每个场所带有编号、坐标、名称、类别等信息,两个场所间可以有路径相通,路长(耗时)各有不同。要求读取该校园平面图&a…...
50【Windows与Linux】
大家可能有些人听过Linux系统,很多初学者被灌输的理念就是服务器必须要装Linux系统 什么是系统? 比如你的电脑是Windows系统的,你手机是Android系统的,物理设备都需要系统,系统你可以理解成直接控制物理设备的一个东…...
蓝桥杯python基础算法(2-2)——基础算法(D)——进制转换*
目录 五、进制转换 十进制转任意进制,任意进制转十进制 例题 P1230 进制转换 作业 P2095 进制转化 作业 P2489 进制 五、进制转换 十进制转任意进制,任意进制转十进制 int_to_char "0123456789ABCDEF" def Ten_to_K(k, x):answer "…...
CSS 溢出内容处理:从基础到实战
CSS 溢出内容处理:从基础到实战 1. 什么是溢出?示例代码:默认溢出行为 2. 使用 overflow 属性控制溢出2.1 使用 overflow: hidden 裁剪内容示例代码:裁剪溢出内容 2.2 使用 overflow: scroll 显示滚动条示例代码:显示滚…...
嵌入式知识点总结 操作系统 专题提升(四)-上下文
针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。 目录 1.上下文有哪些?怎么理解? 2.为什么会有上下文这种概念? 3.什么情况下进行用户态到内核态的切换? 4.中断上下文代码中有哪些注意事项? 5.请问线程需要保存哪些…...
Elasticsearch基本使用详解
文章目录 Elasticsearch基本使用详解一、引言二、环境搭建1、安装 Elasticsearch2、安装 Kibana(可选) 三、索引操作1、创建索引2、查看索引3、删除索引 四、数据操作1、插入数据2、查询数据(1)简单查询(2)…...
携程Android开发面试题及参考答案
在项目中,给别人发的动态点赞功能是如何实现的? 数据库设计:首先要在数据库中为动态表添加一个点赞字段,用于记录点赞数量,同时可能需要一个点赞关系表,记录用户与动态之间的点赞关联,包括点赞时间等信息。界面交互:在 Android 界面上,为点赞按钮设置点击事件监听器。…...
xxl-job 在 Java 项目的使用 以一个代驾项目中的订单模块举例
能搜到这里的最起码一定知道 xxl-job 是用来干什么的,我就不多啰嗦怎么下载以及它的历史了 首先我们要知道 xxl-job 这个框架的结构,如下图: xxl-job-master:xxl-job-admin:调度中心xxl-job-core:公共依赖…...
Alibaba开发规范_异常日志之日志规约:最佳实践与常见陷阱
文章目录 引言1. 使用SLF4J日志门面规则解释代码示例正例反例 2. 日志文件的保存时间规则解释 3. 日志文件的命名规范规则解释代码示例正例反例 4. 使用占位符进行日志拼接规则解释代码示例正例反例 5. 日志级别的开关判断规则解释代码示例正例反例 6. 避免重复打印日志规则解释…...
【数据分析】案例03:当当网近30日热销图书的数据采集与可视化分析(scrapy+openpyxl+matplotlib)
当当网近30日热销图书的数据采集与可视化分析(scrapy+openpyxl+matplotlib) 当当网近30日热销书籍官网写在前面 实验目的:实现当当网近30日热销图书的数据采集与可视化分析。 电脑系统:Windows 使用软件:Visual Studio Code Python版本:python 3.12.4 技术需求:scrapy、…...
需求分析应该从哪些方面来着手做?
需求分析一般可从以下几个方面着手: 业务需求方面 - 与相关方沟通:与业务部门、客户等进行深入交流,通过访谈、问卷调查、会议讨论等方式,明确他们对项目的期望、目标和整体业务需求,了解项目要解决的业务问题及达成的…...
申博经验贴
1. 所谓申博,最重要的就是定制的海投 分成两个部分 1. 定制 要根据每个教授去写不同的,一定不要泛泛的去写,一定要非常非常的具体,要引起教授的兴趣。每个教授每天都会收到几十封邮件,所以要足够的引起教授的注意&a…...
SpringAI 人工智能
随着 AI 技术的不断发展,越来越多的企业开始将 AI 模型集成到其业务系统中,从而提升系统的智能化水平、自动化程度和用户体验。在此背景下,Spring AI 作为一个企业级 AI 框架,提供了丰富的工具和机制,可以帮助开发者将…...
虚幻基础17:动画层接口
能帮到你的话,就给个赞吧 😘 文章目录 animation layer interface animation layer interface 动画层接口:动画图表的集。仅有名字。 添加到动画蓝图中,由动画蓝图实现动画图表。...
SQLAlchemy 2.0的简单使用教程
SQLAlchemy 2.0相比1.x进行了很大的更新,目前网上的教程不多,以下以链接mysql为例介绍一下基本的使用方法 环境及依赖 Python:3.8 mysql:8.3 Flask:3.0.3 SQLAlchemy:2.0.37 PyMySQL:1.1.1使用步骤 1、创建引擎,链接到mysql engine crea…...
Codeforces Round 1002 (Div. 2) A-D
复活!年后首场!本期封面是我自己AI弄的图 A - Milya and Two Arrays 题意 给两个所有数字出现次数都大于2的数组,问能不能修改排序之后对应位置相加得到新的数组使不同数字个数达到3 思路 直接计数就行了,不同的数字匹配一下…...
OpenGL学习笔记(七):Camera 摄像机(视图变换、LookAt矩阵、Camera类的实现)
文章目录 摄像机/观察空间/视图变换LookAt矩阵移动相机(处理键盘输入)移动速度欧拉角移动视角(处理鼠标输入)缩放场景(处理滚轮输入)Camera类 摄像机/观察空间/视图变换 在上一节变换中,我们讨…...
『VUE』vue-quill-editor富文本编辑器添加按钮houver提示(详细图文注释)
目录 预览效果新建一个config.js存放标题编写添加提示的方法调用添加标题方法的生命周期总结 欢迎关注 『VUE』 专栏,持续更新中 欢迎关注 『VUE』 专栏,持续更新中 预览效果 新建一个config.js存放标题 export const titleConfig [{ Choice: .ql-bold…...
