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

算法通关村-----堆在查找和排序中的应用

数组中的第K个最大元素

问题描述

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。详见leetcode215

问题分析

可以创建一个包含k个元素的最小堆,初始时,将数组元素中的前K个放入堆中,之后,遍历数组中的其他元素,与堆顶元素比较,只有大于堆顶元素,才将该元素与堆顶元素替换(即先执行删除,在执行插入),遍历结束后,堆顶元素即是数组中第K大的元素。

代码实现

public int findKthLargest(int[] nums, int k) {if(k>nums.length){return -1;}PriorityQueue<Integer> minHeap = new PriorityQueue<>(4, (a, b) -> a - b);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]);}}return minHeap.poll();
}

堆排序

问题描述

给定整数数组nums,使用堆排序对数组中的元素进行排序。

问题分析

使用堆排序对数组元素进行排序

代码实现

public static void heapSort(int[] nums){PriorityQueue<Integer> minHeap = new PriorityQueue<>(nums.length,(a,b) -> a-b);for (int i = 0; i < nums.length; i++) {minHeap.offer(nums[i]);}for (int i = 0; i < nums.length; i++) {nums[i] = minHeap.poll();}
}

合并K个有序链表

问题描述

给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。详见leetcode23

问题分析

链表数组中存放的其实是每个链表的头节点,可以根据链表的长度创建相同大小的最小堆,将链表中的节点放入堆中,之后,取堆顶元素,即为最小元素,并取出元素的下一个元素放入堆中。

代码实现

public ListNode mergeKLists(ListNode[] lists) {PriorityQueue<ListNode> minHeap = new PriorityQueue<ListNode>((a,b) -> a.val-b.val);for(int i=0;i<lists.length;i++){if(lists[i]!=null){minHeap.offer(lists[i]);}}ListNode vhead = new ListNode(-1);ListNode iter = vhead;while(!minHeap.isEmpty()){ListNode node = minHeap.poll();iter.next = node;iter = node;if(iter.next!=null){minHeap.offer(iter.next);}}return vhead.next;
}

总结

堆查找和排序的应用主要是指堆排序和查找最大最小元素,或者第几大,第几小元素的问题上。这里我们遵循的原则是:

查找:查大用小堆,查小用大堆

排序: 升序用小堆,降序用大堆

堆的操作过程比较复杂,在java中,可以使用优先队列实现堆的操作,因为java中的优先队列是基于堆实现的。

http://www.lryc.cn/news/154867.html

相关文章:

  • 直方图统计增强方法
  • 字节二面:如果高性能渲染十万条数据?
  • Mysql高阶语句(二)
  • 算法笔记 二叉搜索树
  • 微软牵手Linux:Ubuntu“系统”上架win10应用商店啦
  • leetcode做题笔记126. 单词接龙 II
  • windows下运行springboot的jar包,修改替换class文件,修改配置文件application,打包
  • PMD 检查java代码:可以去掉无用的括号(UselessParentheses)
  • 【数据结构练习】栈的面试题集锦
  • 简单工厂模式概述和使用
  • 软件工程概述
  • 国际网页短信软件平台搭建定制接口说明|移讯云短信系统
  • Java“牵手”阿里巴巴店铺所有商品API接口数据,通过店铺ID获取整店商品详情数据,阿里巴巴店铺所有商品API申请指南
  • 【Sql】把数据库字段用函数根据逗号分裂成列表,然后判断列表中是否包含目标值
  • docker基本命令记录
  • web之利用延迟实现复杂动画、animation
  • TCP 和 UDP 的区别、TCP 是如何保证可靠传输的?
  • 鼠标悬停阴影的效果被旁边div挡住的解决办法
  • Go用两个协程交替打印100以内的奇偶数
  • css 文字单行多行超出长度后显示 ...
  • C++将派生类赋值给基类
  • 海外问卷调查是做什么的?
  • Redis——数据结构介绍
  • 附录2-将三国演义按章节存储为不同的txt(bs4)
  • 现代C++中的从头开始深度学习:【6/8】成本函数
  • Vue——vue3中的ref和reactive数据理解以及父子组件之间props传递的数据
  • 新手如何备考PMP考试?
  • FPGA输出lvds信号点亮液晶屏
  • 算法面试-深度学习基础面试题整理(2023.8.29开始,每天下午持续更新....)
  • FireFox禁用HTTP2