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

数组算法之【数组中第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.xdnf.cn/news/16169.html

相关文章:

  • 界面组件DevExpress WPF中文教程:Grid - 如何过滤节点?
  • 服务器对kaggle比赛的数据集下载
  • Linux第三天Linux基础命令(二)
  • NumPy 数组拼接的高级技巧与实践
  • [深度学习] 大模型学习3下-模型训练与微调
  • 利用aruco标定板标定相机
  • 【faiss】用于高效相似性搜索和聚类的C++库 | 源码详解与编译安装
  • 友华PT104E关闭LED
  • 从零开始学习大模型之文本数据处理
  • MSTP实验
  • 字节跳动视觉算法面试30问全景精解
  • 检索增强型生成助力无人机精准数学推理!RAG-UAV:基于RAG的复杂算术推理方法
  • Node.js:RESPful API、多进程
  • linux-日志服务
  • SQLAlchemy 2.0简单使用
  • Linux 使用 screen 窗口会话稳定挂载jar包到后台运行
  • 初识opencv01——基本api操作
  • 解决pip指令超时问题
  • Android AppCompat:实现Material Design向后兼容的终极指南
  • TTL+日志的MDC实现简易链路追踪
  • 【Java SE】Object类
  • 高并发场景下的缓存问题与一致性解决方案(技术方案总结)
  • day059-zabbix自定义监控与自动发现
  • 哔哩哔哩视觉算法面试30问全景精解
  • 【Pytorch】数据集的加载和处理(一)
  • 从效率瓶颈到自动化:火语言 RPA 在日常工作中的技术实践
  • (Arxiv-2025)HiDream-I1:一种高效图像生成基础模型,采用稀疏扩散Transformer
  • Android Surface创建流程
  • CSS自适应布局实战指南
  • Selenium+Java 自动化测试入门到实践:从环境搭建到元素操作