Leetcode 数组中第 k 大的元素

devtools/2024/10/15 4:41:30/

在这里插入图片描述

使用最小堆 (min-heap) 来解决该问题

代码逻辑:

  1. 初始化最小堆并插入前 K 个元素

    • 首先,将数组的前 K 个元素插入到堆中。此时,堆的大小为 K,堆顶元素是这 K 个元素中最小的。
  2. 遍历剩余的数组元素

    • 对于数组的其余元素(从第 K 个元素开始),我们逐个与堆顶元素进行比较。
    • 如果当前元素比堆顶元素大,则说明它有可能是更大的元素之一,此时我们移除堆顶的最小元素,并将当前元素插入堆中。这样可以保持堆中总是存放着 K 个最大的元素。
  3. 返回堆顶元素

    • 最后,堆顶元素就是这 K 个最大的元素中最小的,也就是数组中的第 K 大元素。

代码示例:

class Solution {public int findKthLargest(int[] nums, int k) {// 初始化大小为K的最小堆PriorityQueue<Integer> minHeap = new PriorityQueue<>(k); // 先将前K个元素加入堆中for(int i = 0; i < k; ++i) {minHeap.offer(nums[i]);}// 遍历剩余的元素for(int i = k; i < nums.length; ++i) {// 如果当前元素大于堆顶元素,则替换堆顶元素if(nums[i] > minHeap.peek()) {minHeap.poll(); // 弹出堆顶最小元素minHeap.offer(nums[i]); // 插入当前元素}}// 堆顶元素即为第K大的元素return minHeap.peek();}
}

逻辑解释:

  • 前 K 个元素入堆:在初始化阶段,先将前 K 个元素放入堆中,这一步确保了堆的初始状态是我们想要的(即包含前 K 个元素中的最小值)。

  • 比较和替换:之后,遍历数组中剩余的元素,对于每个元素,我们都与堆顶的最小元素进行比较。只有当当前元素大于堆顶元素时,才会进行替换操作,这样可以确保堆中存放的始终是 K 个最大的元素。

  • 返回结果:最终,当所有元素遍历完毕,堆顶元素就是这 K 个最大元素中的最小值,也就是数组中的第 K 大元素。

更容易理解的原因:

  1. 分步操作:先填充 K 个元素,然后逐步检查和替换剩余元素。将这两部分逻辑分开后,代码的意图非常明确。
  2. 显式的比较:通过 nums[i] > minHeap.peek() 来进行比较,显式地告诉读者当前元素是否应该被插入到堆中,这样逻辑显得更加直观。
  3. 清晰的堆维护:对于每一个新元素,如果它大于堆顶元素,就替换堆顶,使得堆始终维护着当前 K 个最大的元素。

http://www.ppmy.cn/devtools/125985.html

相关文章

基于协同过滤的景区旅游可视化与景区推荐系统(自动爬虫,地点可换)

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍过程展示项目移植每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 本项目是一个综合性的旅游景区数据管理与分析推荐系统,集成了用…

分治算法(7)_归并排序_计算右侧小于当前元素的个数

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 分治算法(7)_归并排序_计算右侧小于当前元素的个数 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&…

UE4 材质学习笔记08(雨滴流淌着色器/雨水涟漪着色器)

一.雨滴流淌着色器 法线贴图在红色通道和绿色通道上&#xff0c;那是法线的X轴和Y轴&#xff0c;在蓝色通道中 我有个用于雨滴流淌的蒙版&#xff0c;在Alpha通道中&#xff0c;有个时间偏移蒙版。这些贴图都是可以在PS上制作做来的&#xff0c;雨滴流淌图可以直接用笔刷画出来…

2024年华为OD机试真题-空栈压数-Python-OD统一考试(E卷)

最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客 每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。 题目描述: 向一个空栈压入…

安卓13usb触摸唤醒系统 android13触摸唤醒

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 android13在待机后,需要能够使用触摸屏去唤醒我们的系统,这就需要我们修改系统的相关配置了。 2.问题分析 对于这个问题,我们需要知道安卓的事件分发,通过事件分发,…

基于微信小程序的旅游拼团系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

Ubuntu切换root用户

在Ubuntu系统中&#xff0c;切换到root用户可以通过以下方法&#xff1a; 使用sudo -i或sudo -s命令&#xff1a;这将提升您的权限到root用户&#xff0c;但不会直接切换到root用户环境。 使用sudo su命令&#xff1a;这将直接切换到root用户环境。 如果您知道root用户的密码…

MySQL 的数据类型

1.整数类型 1.1 tinyint tinyint 为小整数类型&#xff0c;存储空间为1个字节&#xff08;8位&#xff09;&#xff0c;有符号范围-128 ~ 127&#xff0c;无符号范围 0 ~ 255,此类型通常在数据库中表示类型的字段&#xff0c;如某一字段 type 表示学科,其中 “type1” 表示语文…