算法通关村第14关【白银】| 堆的经典问题

2023-09-20 10:42:46

1.数组中的第k个最大元素

思路:

  • 最直观的就是选择法,遍历一k次找到第k大的数
  • 之前使用快速排序的思想每次找出一个位置,会超时
  • 这里使用堆(优先队列),找最大用小堆,找最小用大堆。

例如找第k大的数,新建一个空间为k的最小优先队列,只要比当前优先队列最小值大就替换进去,这样全部的数遍历一遍,里面留下的就是前k大的数了,其他的全被替换出去了,并且队头是第k最大的。

class Solution {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> pq = new PriorityQueue<>(k);
        for(int n : nums){
            if(pq.size()<k){
                pq.offer(n);
            }else{
                if(n>pq.peek()){
                    pq.poll();
                    pq.offer(n);
                }
            }
        }
        return pq.peek();
    }
}

2.堆排序原理

  1. 构建最大堆(Max Heap):首先,将待排序的元素构建成一个最大堆。最大堆是一个满足堆性质的二叉树,即每个节点的值都大于或等于其子节点的值,根节点是堆中的最大元素。

    构建最大堆的过程:从数组中的最后一个非叶子节点开始,逐个向前处理每个节点,将当前节点与其子节点比较并进行交换,直到整个数组构建成一个最大堆。
  2. 排序:一旦构建了最大堆,最大元素就位于堆的根节点(数组的第一个元素)。将根节点(最大元素)与数组中的最后一个元素交换,然后将数组的大小减1,将根节点下沉到适当位置,以保持剩余元素的最大堆性质。重复这个过程,直到整个数组有序。

 堆排序的时间复杂度为O(n * log n),其中n是待排序数组的元素数量。由于堆排序是一种原地排序算法,不需要额外的辅助空间,因此它在空间复杂度上表现较好。堆排序的稳定性取决于在构建最大堆时是否采用稳定的下沉方法,通常情况下是不稳定的排序算法。

3.合并k个升序链表

思路:题目要求从小到大排序构造一个新的链表,这里要保证每次加入的元素是当前最小的,使用优先队列构造小根堆。将ListNode数组第一个元素加入队列,每次取出队头然后加入取出的元素的下一个。

PriorityQueue详解可以看 PriorityQueue初始化和方法

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if(lists.length == 0){
            return null;
        }
        ListNode head = new ListNode(-1);
        PriorityQueue<ListNode> q = new PriorityQueue<>(lists.length,(a,b)->a.val-b.val);
        for(int i = 0;i<lists.length;i++){
            if(lists[i] == null) continue;
            q.add(lists[i]);
        }
        ListNode tail = head;
        while(!q.isEmpty()){
            tail.next = q.poll();
            tail = tail.next;
            if(tail.next!=null){
                q.offer(tail.next);
            }
        }
        return head.next;
    }

}

更多推荐

lua环境搭建数据类型

lua作为一门计算机语言,从语法角度个人感觉还是挺简洁的接下来我们从0开始学习lua语言。1.首先我们需要下载lua开发工具包在这里我们使用的工具是luadist下载链接为:https://luadist.org/repository/下载后的压缩包解压后就能用。2.接下来就是老生常谈的配置环境变量步骤如下计算机高级系

Linux服务器自定义登陆提示信息

背景最近在搭建zookeeper和应用服务环境,需要配置很多东西,然后不同服务器的文件路径之类的东西可能会有一些不同,比较麻烦,就准备给每个服务器配置一个登陆提示,让每一个登陆的用户能很快了解配置信息和文件路径。1,/etc/issue/etc/issue是Linux终端登录的欢迎语句存储文件,/etc/issue的文

【Rust日报】2023-09-18 如何教会 AI 射击

如何教会AI射击作者尝试构建一个可以学习射击目标的神经网络,这段视频展示了大约这3周的进展。神经网络是用Rust编程语言从头构建的(主要基于作者之前的一个自动驾驶项目)。使用Bevy游戏引擎进行可视化。目前,模拟中还缺乏的是一些图表和其他衡量进度的指标,在下一个版本中,作者计划添加这些功能以及其他必要的UI更新。一旦完

jupyter notebook插件安装及插件推荐

安装插件安装插件选择的工具栏pipinstalljupyter_contrib_nbextensions将插件工具栏添加到jupyternotebook页面jupytercontribnbextensioninstalldisableconfigurationfornbextensionswithoutexplicit

[python 刷题] 128 Longest Consecutive Sequence

[python刷题]128LongestConsecutiveSequence题目:Givenanunsortedarrayofintegersnums,returnthelengthofthelongestconsecutiveelementssequence.Youmustwriteanalgorithmthatr

MOS管的二级效应及其对伏安特性的影响

前言相信MOS管的理想伏安特性相信各位都在模拟电路中学过,但实际上,该理想图仅是实际图的一个近似,忽略几乎所以的二级效应。因此,为了深入理解非理想的MOS的伏安特性,了解最重要的几个二级效应是很有必要的。本文主要涉及各个参数之间的影响关系,并不涉及具体公式计算,仅做了解。速度饱和与迁移率降低效应载流子的漂移速率以及因此

Blazor前后端框架Known-V1.2.15

V1.2.15Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行。Gitee:https://gitee.com/known/KnownGithub:https://github.com/known/Known概述基于C#和Blazor实现的快速开发框架,前后端分离,开

SpringMVC异常处理

1概述SpringMVC框架处理异常的常用方式:使用@ExceptionHandler注解处理异常。2@ExceptionHandler注解和用@ControllerAdvice注解2.1@ExceptionHandler注解使用注解@ExceptionHandler可以将一个方法指定为异常处理方法。该注解只有一个可选

C#__使用流读取和写入数据的简单用法

使用流处理数据的优势:可以一次性搬运数据量大的文件,把数据当做水,一点一点搬运。数据的传输方向:从外部源传输到程序(读取流);从程序传输到外部源(读入流)外部源:文件、网络数据、内存区域、命名管道读写内存:System.IO.MemorySystem处理网络数据:System.Net.Sockets.NetworkSt

让Pegasus天马座开发板用上OLED屏

继上篇《让Pegasus天马座开发板吃上STM8S标准库》移植完标准库之后,于是我又想为天马座开发板添加一块屏幕。终于在我的零件箱底下找到了沉入箱底多年的0.96OLED屏幕。屏幕介绍这个是128x64像素的屏幕模块,其使用的SSD1306的驱动IC。而目前该模组,只支持3/4线SPI及I2C通信方式。硬件连接我将天马

centos7如何释放磁盘空间?

centos7磁盘满了,但是找不到大的文件,原因是没有释放磁盘空间小白教程,一看就会,一做就成。1.原因当centos系统下启动多个服务且没有一定的清理机制时(比如日志),系统磁盘空间很容易就被占满,但是有时候删除了文件却发现系统磁盘空间未释放,可能原因是忽略了有应用一直在往其中写数据,直接删除某文件无法释放磁盘空间2

热文推荐