当前位置: 首页 > news >正文

数组算法之【数组中第K个最大元素】

目录

LeetCode-215题


LeetCode-215题

给定整数数组nums和整数k,返回数组中第k个最大元素

public class Solution {/*** 这里是基于小顶堆这种数据结构来实现的*/public int findKthLargest(int[] nums, int k) {// 实例化一个小顶堆MinHeap minHeap = new MinHeap(k);// 往小顶堆中添加k个元素for (int i = 0; i < k; i++) {minHeap.offer(nums[i]);}// 添加k个元素之后for (int i = k; i < nums.length; i++) {// 遇到不大于堆顶元素的直接跳过不管,继续下一个if (nums[i] <= minHeap.peek()) {continue;}// 遇到大于堆顶元素的就将其把堆顶元素替换minHeap.replace(nums[i]);}// 此时堆顶元素就是第k个最大元素return minHeap.peek();}/*** 自定义一个小顶堆*/private static class MinHeap {private final int[] container;private int size;public MinHeap(int capacity) {container = new int[capacity];}/*** 添加元素*/public boolean offer(int num) {if (size == container.length)return false;// 执行上浮操作siftUp(num);return true;}/*** 上浮*/private void siftUp(int num) {int child = size++;// 通过子节点找父节点位置int parent = (child - 1) >> 1;// 只要满足条件就一直找并比较while (child > 0 && container[parent] > num) {container[child] = container[parent];child = parent;parent = (child - 1) >> 1;}// 新添加的元素放到合适的位置container[child] = num;}/*** 替换顶部元素*/public void replace(int num) {container[0] = num;// 执行下潜操作siftDown(0);}/*** 下潜*/private void siftDown(int parent) {// 通过父节点位置找左子节点和右子节点的位置int left = (parent << 1) + 1;int right = left + 1;// 只要满足有任一子节点的值小于父节点的值就交换顺序int min = parent;if (left < size && container[left] < container[min]) {min = left;}if (right < size && container[right] < container[min]) {min = right;}if (min != parent) {swap(parent, min);siftDown(min);}}/*** 交换i位置和j位置上的值*/private void swap(int i, int j) {if (i == j)return;container[i] = container[i] ^ container[j];container[j] = container[i] ^ container[j];container[i] = container[i] ^ container[j];}/*** 查看堆顶元素*/public int peek() {return container[0];}}
}

http://www.dtcms.com/a/293610.html

相关文章:

  • RK3568笔记九十:基于web显示RTSP流
  • 【第三章自定义检视面板_创建自定义编辑器_如何创建自定义PropertyDrawer(9/9)】
  • SQL 中 CASE WHEN 及 SELECT CASE WHEN 的用法
  • HF86611_VB1/HF86611Q_VB1:多通道USB HiFi音频解码器固件技术解析
  • CLI 与 IDE 编码代理比较:提升开发效率的两种路径
  • docker安装minio及配置禁止列出目录文件
  • 解决Node 17+版本与Metro、Webpack等兼容性问题(500)
  • 【计算机网络】正/反向代理服务器,有状态/无状态应用
  • 构建高性能推荐系统:MixerService架构解析与核心实现
  • Spring-IoCDI
  • VPS海外部署Linux分布式计算任务调度-跨国资源整合方案
  • Git 常用的提交类型
  • Object Sense (OSE):一款从编辑器脚本发展起来的编程语言
  • 【数学建模 | Matlab】二维绘图 和 三维绘图
  • 2025年7月一区SCI-投影迭代优化算法Projection Iterative Methods-附Matlab免费代码
  • kotlin基础【1】
  • MATLAB 2024b深度学习新特性全面解析与DeepSeek大模型集成开发技术
  • android studio(NewsApiDemo)100%kotlin
  • 如何在 npm 上发布 Element Plus 二次封装组件
  • Oracle 常用 SQL 命令集合
  • 将 `knife4j` 和 `springdoc-openapi` 集成到你的 Spring Boot 应用
  • 微软Fabric重塑数据管理:Forrester报告揭示高ROI
  • 一次Oracle集群脑裂问题分析处理
  • 前端实现类浏览器的 Ctrl+F 全局搜索功能(Vue2 + mark.js,用于Electron 、QT等没有浏览器Ctrl+F全局搜索功能的壳子中)
  • Oracle迁移到高斯,查询字段默认小写,解决办法
  • Qt 常用控件 - 1
  • 分布式风电分散式风电
  • Qt内存管理的核心点
  • 技术速递|使用 Semantic Kernel 与 A2A 协议构建多智能体解决方案
  • MCP:UVX的安装