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

Java - 数组实现大顶堆

题目描述

实现思路

要实现一个堆,我们首先要了解堆的概念。

堆是一种完全二叉树,分为大顶堆和小顶堆。

  • 大顶堆:每个节点的值都大于或等于其子节点的值。

  • 小顶堆:每个节点的值都小于或等于其子节点的值。

完全二叉树:在一颗二叉树中,若除最后一层外的其余层都是满的,并且最后一层要么是满的,要么在右边缺少连续若干节点。

回到原题,实现一个大顶堆,使用数组作为底层数据结构,并提供以下操作:

  • 添加元素(add):向堆中添加一个元素。

  • 删除堆顶元素(poll):删除并返回堆顶元素(即最大值)。

 

首先我们需要明白一个事:

jdk提供的堆结构,也就是PriorityQueue优先级队列,删除堆顶元素(remove(),poll()),会进行下

沉操作,向最后插入元素(add(),offer()),会进行上浮操作,因为有这两个操作,所以在堆中,删除

堆顶元素,向最后插入元素不会改变堆结构。

但是向堆的中间进行插入或修改,就会改变堆结构,不会自己调整

所以我们实现堆,也得需要实现上浮和下沉操作

并且在上浮和下沉过程中,还需要交换元素,所以我们还需要实现一个数组中元素交换的函数

代码实现

	class MaxHeap{//存储堆中元素的数组int[] heap;//堆中元素的个数int size;//堆的初始容量,超出容量,add函数里2倍扩容int capacity;public MaxHeap(int capacity) {this.capacity = capacity;heap = new int[capacity];size = 0;}public void add(int value) {//判断是否需要扩容if(size == capacity) {capacity = capacity * 2;int[] newHeap = new int[capacity];System.arraycopy(heap,0,newHeap,0,size);heap = newHeap;}heap[size] = value;size++;heapifyUp();}//上浮操作,维持堆的性质public void heapifyUp() {//当前节点对应在数组中的索引int index = size - 1;//父节点的在数组中的索引 -- 只能有一个父节点int parentIndex = (index - 1) / 2;while(parentIndex >= 0 && heap[parentIndex] < heap[index]) {swap(heap,parentIndex,index);index = parentIndex;parentIndex = (index - 1) / 2;}}//删除并返回堆顶元素public int poll() {//判断堆中是否有元素if(size == 0) {return Integer.MIN_VALUE;}int maxValue = heap[0];heap[0] = heap[size - 1];size--;heapifyDown();return maxValue;}//下沉操作,维持堆的性质public void heapifyDown() {int index = 0;//一个节点有两个子节点int leftChildIndex = 2 * index + 1;int rightChildIndex = 2 * index + 2;while(leftChildIndex < size) {//找到左右子节点中比较大的那个int largerChildIndex = leftChildIndex;if(rightChildIndex < size && heap[rightChildIndex] > heap[leftChildIndex]) {largerChildIndex = rightChildIndex;}//如果当前节点大于等于最大的子节点,堆性质已经满足if(heap[index] >= heap[largerChildIndex]) {break;}swap(heap,index,largerChildIndex);index = largerChildIndex;leftChildIndex = 2 * index + 1;rightChildIndex = 2 * index + 2;}}public void swap(int[] nums,int i,int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}

类似题目

【模板】堆_牛客题霸_牛客网
215. 数组中的第K个最大元素 - 力扣(LeetCode)

相关文章:

Java - 数组实现大顶堆

题目描述 实现思路 要实现一个堆&#xff0c;我们首先要了解堆的概念。 堆是一种完全二叉树&#xff0c;分为大顶堆和小顶堆。 大顶堆&#xff1a;每个节点的值都大于或等于其子节点的值。 小顶堆&#xff1a;每个节点的值都小于或等于其子节点的值。 完全二叉树&#xff…...

ifuse挂载后,在python代码中访问iOS沙盒目录获取app日志

上一次使用pymobiledevice3&#xff0c;在python代码中访问app的沙盒目录并分析业务日志&#xff0c;在使用过程中发现&#xff0c;在获取app日志的时候速度很慢&#xff0c;执行时间很长&#xff0c;需要30-61秒&#xff0c;所以这次尝试使用libimobiledevic和ifuse&#xff0…...

Windows WSL环境下安装 pytorch +ROCM 支持AMD显卡

官方文档&#xff1a;Install PyTorch for ROCm — Use ROCm on Radeon GPUs 一、操作系统及驱动 windows 下安装WSL 环境( windows subsystem for Linux), 安装ubuntu 22.04环境。 安装 rocm 软件包&#xff1a; sudo apt update wget https://repo.radeon.com/amdgpu-insta…...

uniapp中skymap.html(8100端口)提示未登录的排查与解决方法

问题&#xff1a; 目前账号已经登录&#xff0c;uniapp的其他端口均可以访问到数据&#xff0c;唯独skymap.html中的8100会提示未登录。&#xff08;8100是后端网关gateway端口&#xff09; 分析&#xff1a; 在 skymap.html 中遇到未登录提示的问题&#xff0c;通常是由于该…...

训练模型时梯度出现NAN或者INF(禁用amp的不同level)

判断参数梯度位nan或inf的代码&#xff1a; for name, param in model.named_parameters():if param.grad is not None:if torch.isnan(param.grad).any() or torch.isinf(param.grad).any():print(f"grad layer [{name}] is NaN or Inf") 首先来说可能得原因&…...

Maven核心概念

一、项目对象模型&#xff08;POM&#xff09; 1. 定义 POM&#xff08;Project Object Model&#xff09;是 Maven 项目的核心配置文件&#xff0c;它以 XML 格式描述了项目的基本信息、项目依赖、构建配置等。可以说&#xff0c;POM 是 Maven 理解和处理项目的基础。 2. 基…...

Sonatype Nexus 部署手册

文章目录 一、前言二、软件环境2.1 版本变更&#xff1a;2.1.1 变更存储的原因2.2.2 H2作为存储的注意点 三、资源配置四、开始部署4.1 部署jdk174.2 离线部署nexus4.2.1 下载4.2.2 部署1. 上传到服务器2. 解压3. 添加用户4. 修改启动参数5. 迁移sonatype-work &#xff0c;并授…...

TLV320AIC3104IRHBR 数据手册 一款低功耗立体声音频编解码器 立体声耳机放大器芯片麦克风

TLV320AIC3104 是一款低功耗立体声音频编解码器&#xff0c;具有立体声耳机放大器以及在单端或全差分配置下可编程的多个输入和输出。该器件包括基于寄存器的全面电源控制&#xff0c;可实现立体声 48kHz DAC 回放&#xff0c;在 3.3V 模拟电源电压下的功耗低至 14mW&#xff0…...

(8)结构体、共用体和枚举类型数据

1. 结构体、共用体的定义及区别,typedef 定义别名 结构体的定义 结构体是一种用户自定义的数据类型,它可以将不同类型的数据组合在一起。例如,定义一个表示学生信息的结构体: // 定义结构体类型 struct Student struct Student {char name[20];int age;float score; };共…...

Jedis操作和springboot整合redis

Jedis-springboot整合redis Jedis 引入jedis依赖 注意事项 测试相关数据类型 Key String List set hash zset 案例 spring boot整合redis 引入相关依赖 在application.properties中配置redis 配置 创建redis配置类 创建测试类 Jedis 引入jedis依赖 <depen…...

基于AI大模型的复杂扫描件PDF信息提取与规整

前言 场景大致是会上传一个几十页的扫描件PDF&#xff0c;让AI在当中找出我需要的字段&#xff0c;本文会隐去具体行业信息和具体的AI提示词内容&#xff0c;只分享技术相关内容&#xff0c;请见谅。 AI模型选择 针对我们行业的使用场景&#xff0c;我主要测试了GPT、Claude以…...

为什么https先非对称加密,然后对称加密?

HTTPS之所以先使用非对称加密&#xff0c;然后在对称加密&#xff0c;主要是基于两者在加密效率与安全性方面的特性考虑。 首先&#xff0c;非对称加密具有极高的安全性&#xff0c;因为它使用了公钥和私钥这一对密钥。公钥是公开的&#xff0c;任何人都可以使用它来加密数据&…...

【Coroutines】Full Understanding of Kotlinx.Corutines Framework

文章目录 What is CorutinesDifference between Corutine and ThreadFast UsageSuspend FunctionAdvanced Usage of CoroutineCoroutine EssentialsCoroutineContextCoroutineScopePredefined CoroutineScopePredefined DispatchersPredefined CoroutineStartJobCreate a Corou…...

Python面向对象,实现图片处理案例,支持:高斯模糊、Canny边缘检测、反转边缘图像、生成手绘效果、调亮度......等等

实验图片如下&#xff1a; 命名为img1.jpg, 放在项目下新建文件夹images下 项目构造如下&#xff1a; app.py源码如下 import cv2 import os from matplotlib import pyplot as plt import numpy as npclass ImageProcessor:def __init__(self, image_path):self.image cv…...

SOLID - 依赖倒置原则(Dependency Inversion Principle)

SOLID - 依赖倒置原则&#xff08;Dependency Inversion Principle&#xff09; 定义 依赖倒置原则&#xff08;Dependency Inversion Principle&#xff0c;DIP&#xff09;是面向对象设计中的五大基本原则之一&#xff0c;通常缩写为SOLID中的D。DIP由Robert C. Martin提出&…...

【.NET 8 实战--孢子记账--从单体到微服务】--需求拆分与规划

在上一篇文章中我们收集了需求&#xff0c;并对需求进行了简单的分析和规划&#xff0c;但是对于开发人员来说&#xff0c;上一篇文章的需求还不够详细&#xff0c;并且没有形成计划。因此本篇文章将带领大家来拆分需求并规划开发里程碑。 一、详细需求列表 项目组进行了多次…...

在macOS的多任务处理环境中,如何平衡应用的性能与用户体验?这是否是一个复杂的优化问题?如何优化用户体验|多任务处理|用户体验|应用设计

目录 一 多任务处理与应用性能 1. macOS中的多任务处理机制 2. 性能优化的基本策略 二 用户体验的关键要素 1. 响应速度 2. 界面友好性 3. 功能的直观性 三 平衡性能与用户体验的策略 1. 资源管理 2. 优化数据加载 3. 使用合适的线程模型 4. 实时监测和调整 四 使…...

Vscode配置CC++编程环境的使用体验优化和补充说明

文章目录 快速编译运行&#x1f47a;code runner插件方案Code Runner Configuration 直接配置 相关指令和快捷键默认task配置和取消默认 配置文件补充介绍(可选 推荐阅读)&#x1f60a;使用vscode预置变量和环境变量环境变量的使用使用环境变量的好处环境变量可能引起的问题 检…...

十个方法杜绝CAD图纸泄密风险!2024年图纸防泄密指南!「必看」

随着信息技术的发展&#xff0c;CAD图纸的应用日益普遍&#xff0c;然而随之而来的图纸泄密风险也愈加严重。企业在提升效率的同时&#xff0c;更需重视信息安全。为此&#xff0c;本文将介绍十个有效的方法&#xff0c;帮助企业杜绝CAD图纸泄密风险&#xff0c;保障商业机密。…...

技术干货|HyperMesh CFD功能详解:虚拟风洞 Part 1

虚拟风洞VWT 从2023版本开始&#xff0c;虚拟风洞VWT&#xff08;Virtual Wind Tunnel&#xff09;模块合并到HyperMesh CFD中。 用户在VWT模块中完成LBM求解器ultraFluidX的前处理设置&#xff0c;导出参数文件XML和模型文件STL&#xff0c;并在GPU服务器上提交计算。 VWT目前…...

Flowable 7.x 实战:手把手教你从前端按钮到后端接口,完整实现流程图查看功能

Flowable 7.x 实战&#xff1a;从前端按钮到后端接口的流程图查看全链路实现 在Spring Boot与Vue/React技术栈的企业级应用中&#xff0c;流程引擎的集成往往需要前后端协同完成功能闭环。本文将以查看流程图功能为切入点&#xff0c;完整呈现从权限控制到图像渲染的全链路实现…...

从HCCDA题库看实战:GaussDB开发者必须掌握的10个核心操作(附实验截图指南)

从HCCDA题库看实战&#xff1a;GaussDB开发者必须掌握的10个核心操作&#xff08;附实验截图指南&#xff09; 在数据库技术的世界里&#xff0c;认证考试往往被视为理论知识的试金石&#xff0c;但真正考验开发者能力的&#xff0c;是如何将这些理论转化为实际生产力。GaussDB…...

2026年专业深度测评:超强增压花洒套装排名前五权威榜单

一、开篇&#xff1a;行业趋势与测评声明随着消费者对居家生活品质要求的精细化提升&#xff0c;以及高层住宅、老旧小区水压不稳问题的普遍存在&#xff0c;具备稳定出水与舒适沐浴体验的超强增压花洒套装已成为市场核心需求。为帮助消费者在众多产品中做出科学决策&#xff0…...

2026届最火的降重复率工具实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 维普平台针对AIGC技术的引入&#xff0c;制定了严谨的检测规范&#xff0c;在当前学术场景里…...

宝塔Linux面板Bug修复:添加反向代理出错

起因 由于工作需要&#xff0c;在宝塔面板中创建一个反向代理的站点&#xff0c;结果每次都报错: 向宝塔论天提交了Bug&#xff0c;结果两天了还在审核中。 由于急用&#xff0c;因此不等官方修复了&#xff0c;自己动手修复&#xff01; 故障原因 从报错信息可以看到&…...

OpenCV 实现人脸识别:LBPH/Eigen/Fisher 三大算法实战详解

在人工智能飞速发展的今天&#xff0c;人脸识别已经成为我们生活中无处不在的技术 —— 手机解锁、刷脸支付、门禁考勤、安防监控等场景&#xff0c;都离不开人脸识别技术的支撑。对于 Python 开发者而言&#xff0c;OpenCV 库提供了开箱即用的人脸识别接口&#xff0c;无需深入…...

SecGPT-14B模型压力测试:验证OpenClaw高并发安全任务的稳定性

SecGPT-14B模型压力测试&#xff1a;验证OpenClaw高并发安全任务的稳定性 1. 测试背景与目标 最近在探索如何将OpenClaw与安全大模型结合&#xff0c;构建一个自动化安全分析助手。SecGPT-14B作为一款专注于网络安全的大模型&#xff0c;理论上可以处理端口扫描、日志分析等任…...

Manta发票应用字体定制终极指南:如何为专业发票添加完美排版效果

Manta发票应用字体定制终极指南&#xff1a;如何为专业发票添加完美排版效果 【免费下载链接】Manta &#x1f389; Flexible invoicing desktop app with beautiful & customizable templates. 项目地址: https://gitcode.com/gh_mirrors/ma/Manta &#x1f389; 想…...

基于STM32的充电桩控制器设计(有完整资料)

资料查找方式&#xff1a;特纳斯电子&#xff08;电子校园网&#xff09;&#xff1a;搜索下面编号即可编号&#xff1a;T4532205M设计简介&#xff1a;本设计是基于单片机的充电桩控制器设计&#xff0c;主要实现以下功能&#xff1a;1、RFID可以注册卡以及删除卡&#xff0c;…...

【30】软考软件设计师——UML类图与用例图满分精讲|下午第3题常考核心

摘要:本文是《软件设计师50讲通关|从零基础到工程师职称》专栏第30篇,聚焦模块四:应用技术(下午题)第3道高频大题,UML建模是历年下午必考核心,单题分值稳定10~12分。全文深度拆解两大核心UML图表:类图与用例图,超详细讲解类图三层结构、可见性修饰符、五大核心关系(…...