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

常州百度网站排名龙山建设集团有限公司网站

常州百度网站排名,龙山建设集团有限公司网站,好搜网惠州seo,品牌建设的意义是什么题目描述 实现思路 要实现一个堆,我们首先要了解堆的概念。 堆是一种完全二叉树,分为大顶堆和小顶堆。 大顶堆:每个节点的值都大于或等于其子节点的值。 小顶堆:每个节点的值都小于或等于其子节点的值。 完全二叉树&#xff…

题目描述

实现思路

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

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

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

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

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

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

  • 添加元素(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)

http://www.yayakq.cn/news/693690/

相关文章:

  • 网站开发语言 .net黑客做的网站好用不
  • 上海网站建设哪里便宜网站搭建免费模板
  • 简单网站制作成品太原网站优化培训
  • 教你如何快速建站阿里云服务器一个月多少钱
  • 丽水北京网站建设网站建设怎么用长尾做标题
  • 桓台建设局网站qq空间网站
  • wordpress文章添加字段不重复企业网站关联优化
  • 网站制作需要学什么语言购物网站管理层
  • 刷排名凡搜网站宝wordpress 加载排版
  • 天门市网站建设公司网站建设需要要求什么
  • 长宁区科技网站建设黑龙江省住房和建设厅网站首页
  • 哪些做网站的公司比较好厦门无忧网站建设有限公司
  • 新网站百度seo如何做静态网站的好处就是安全性好从而
  • 商城网站开发网站建设费税率多少钱
  • 网站服务器的费用做业务不花钱的网站有哪些
  • 注册型网站推广微信如何分享wordpress
  • 在建设厅网站上下载资质标准网站信息安全保障制度建设情况
  • 怎么看网站是asp还是php股票订阅网站开发
  • 不备案的网站需要注销吗制作个人网页教程
  • 备案时如何关闭网站网站做301排名会掉
  • 网站优化图片链接怎么做李静做的化妆品网站
  • 网站定制化价格网站运营seo实训总结
  • 西宁公司做网站门户网站的类型
  • 呼市网站建设公司制作网页时文字可以做超链接吗
  • 海口网站建设的开发方案搜索网站入口
  • 备案网站用户名是什么广州建站网站
  • app 网站 比较南通建设公司网站
  • 高质量的中山网站建设行业电子网站建设
  • wordpress曹鹏做网络优化的公司排名
  • wordpress做的著名网站wordpress 浮动