java数据结构与算法刷题-----LeetCode215. 数组中的第K个最大元素

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

在这里插入图片描述

解题思路:时间复杂度O( n n n),空间复杂度O( l o g 2 n log_2{n} log2n)
  1. 使用小根堆,建堆时间复杂度O(k),调整堆(删除堆顶并插入新元素)O( n ∗ l o g 2 k n*log_2k nlog2k),其中k是题目要求的返回第k最大元素。因此小根堆大小为k,故建堆为O(k). 共计O( k + n ∗ l o g 2 k k+n*log_2k k+nlog2k) = O(n)
  2. 不断地将元素插入到小根堆(根最小,其它元素都比根大)中,当堆中有k个元素,此时还需要往堆中插入元素时,需要进行判断。
  3. 因为此时堆顶元素正好是堆中倒数第k大元素。如果新插入元素比堆顶大。证明当前堆顶不是倒数第k大
  4. 则堆顶删除,并将新元素插入。此时调整堆,新的堆顶元素为第k大。以此类推。直到所有元素入堆后。
  5. 最终返回堆顶即可。
堆排序https://blog.csdn.net/grd_java/article/details/136937525
代码:当前官方增加了很多测试用例,已经无法超越100%的用户了,目前最快的算法,只能达到17ms,进行优化后,也只到了15ms。我查看2021年提交时的记录,是3ms超越100%。目前已经无法达到了。
  1. 使用Java提供的优先级队列实现小根堆(面试时候肯定不让你用。因此这个代码帮你理解整体的思路。然后第二个实现方法,我们需要自己实现小根堆)
    在这里插入图片描述
class Solution {
    //[6,5]
    //
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
            //返回值>0,o1放在o2后面。反之o1放o2前面
            //小根堆,小的在前面。利用o1-o2实现。如果o1小,o1-o2<0,o1会放在o2前面
            //如果o1大o2小,o1-o2>0,o1会放在o2后面。而小的o2放在o1前面
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        });
        for(int num:nums){
            if(queue.size() == k){
                if(queue.peek() < num) {
                    queue.poll();
                    queue.offer(num);
                }
            }else{
                queue.offer(num);
            }
        }
        return queue.poll();
    }
}
  1. 自己实现小根堆,因为Java自带容器加了很多健壮性和线程安全的逻辑,所以效率较慢,我们自己实现小根堆就会快很多。
    在这里插入图片描述
class Solution {
        public int findKthLargest(int[] nums, int k) {
        int[] minHeap = new int[k];//小根堆
        for (int i = 0; i < k; i++) {//大小为k
            minHeap[i] = nums[i];
        }
        //k/2-1是二叉树的知识,代表以k个结点构成的二叉树的第一个非叶子结点。k/2-2是第二个非叶子,以此类推。i == 0是整个二叉树的根结点
        for (int i = k / 2 - 1; i >= 0; i--) {//调整小根堆,从下到上,依次让每一颗子树满足小根堆
            adjustHeap(minHeap, i);//i是二叉树的每个非叶子结点,小根堆的要求是:每个子树,根结点都是整棵树最小
        }
        //小根堆构建完成后,minHeap[0]就是当前第k大的数。接下来需要不断进行判断和入堆操作
        for (int i = k; i < nums.length; i++) {
            if (nums[i] > minHeap[0]) {//如果当前i,是比小根堆堆顶更大的元素,那么堆顶不是第k大,
                minHeap[0] = nums[i];//将堆顶出堆,并将i放在堆顶位置
                adjustHeap(minHeap, 0);//此时很有可能小根堆逻辑被破坏,也就是i太大,不满足小根堆,因此需要让i进行下降调整,让其重新满足小根堆定义
            }
        }
        return minHeap[0];
    }

    /**
     * 以root为根结点构建/调整堆
     * @param array 堆
     * @param root 当前根结点
     */
    private void adjustHeap(int[] array, int root) {
        //让root结点下降到合适位置,以满足小根堆效果(任何一颗子树,根结点都是最小的)
        while (true) {//当堆调整完成后,结束
            int left = 2 * root + 1;//获得root的左子结点下标
            int right = left + 1;//获得root的右子结点下标
            int min = root;//最小值,最终需要放到root结点位置
            //如果左子结点存在,并且左子结点更小,让min指向这个结点
            if (left < array.length && array[left] < array[min]) min = left;
            //如果右子结点存在,并且右子结点更小,让min指向这个结点
            if (right < array.length && array[right] < array[min]) min = right;
            //如果min == root说明小根堆调整结束
            if (min == root) break;
            //让min当前指向位置和root交换,也就是下降操作,说明root当前指向的结点不是最小值,不满足小根堆
            //因为小根堆,越上面层次的结点,越小,所以如果当前root太大,需要让其下降
            swap(array, root, min);
            //root本次下降完成后,min的位置是root新的位置。因为root下降到min的位置
            //让root指向min,然后继续循环,判断是否root需要继续下降。直到它下降到合适位置
            root = min;
        }
    }

    private void swap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/478140.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】训练Stable Diffusion环境

仓库&#xff1a; https://github.com/bmaltais/kohya_ss.git 基础镜像&#xff1a; from kevinchina/deeplearning:sdxllighting_trt_nginx_002api docker run --net host --gpus device0 -e APIWORKS1 -it t1:t1 bash构建环境&#xff1a; sudo -i git clone https://git…

算法第三十一天-直方图的水量

直方图的水量 题目要求 解题思路 使用面向列的计算比面向行的计算更加容易。我们只需要考虑当前的位置的左右最高模板的高度。 方法一、暴力解法 每个位置能接到多少雨水&#xff0c;很容易想到[木桶效应]&#xff0c;即是由两边最短的木板限制的。那么直观思路就是&#x…

C语言 动态内存管理

目录 前言 一、动态内存分配 二、malloc和free函数 2.1 malloc函数 2.2 free函数 三、calloc和realloc函数 3.1 calloc函数 3.2 realloc函数 四、常见的动态内存的错误 1.对NULL指针的解引用操作 2.对动态开辟空间的越界访问 3.对非动态开辟内存使用free释放 4.使用…

深度学习-2.8模型拟合概念和欠拟合模型、过拟合调整策略

模型拟合概念和欠拟合模型、过拟合调整策略 文章目录 模型拟合概念和欠拟合模型、过拟合调整策略一、模型拟合度概念介绍1.测试集的“不可知悖论”2.模型拟合度概念与实验 二、过拟合、欠拟合问题解决方案1. 欠拟合解决方案2.过拟合解决方案 三、神经网络结果选择策略1. 参数和…

拼多多2023年实现营收2476亿 助力品质好物与消费升级双向奔赴

拼多多集团近日发布了截至去年12月31日的财务业绩报告&#xff0c;拼多多在2023年第四季度实现了889亿元的营收&#xff0c;同比增长了惊人的123%。而在全年范围内&#xff0c;拼多多的营收更是高达2476亿元&#xff0c;同比增长了90%。 去年是拼多多全面拥抱高质量发展的元年…

晶体管图示仪 能测 IGBT. Mosfet. Diode. BJT......

STD2000晶体管图示仪系统能测试很多电子元器件的静态直流参数&#xff08;如击穿电压V(BR)CES/V(BR)DSs、漏电流ICEs/lGEs/IGSs/lDSs、阈值电压/VGE(th)、开启电压/VCE(on)、跨导/Gfe/Gfs、压降/Vf、导通内阻Rds(on)&#xff09;。 测试种类覆盖 7 大类别26分类&#xff0c;包…

解锁企业数字化运营管理:论专业数据中台解决方案的重要性-亿发

没有数据中台&#xff0c;数字化经营就像是建立在沙滩上的城堡&#xff0c;缺乏坚实的基础支撑。数据中台对于企业数字化经营能力的建设至关重要&#xff0c;它扮演着连接、整合和管理数据的关键角色&#xff0c;出现将扩展企业可利用数据的范围。传统的业务分析主要使用财务数…

Python使用PaddleOCR进行图片转文字

PaddleOCR是百度飞桨开发的OCR库 安装 安装PaddleOCR&#xff0c;只需要两个命令&#xff1a; pip install paddlepaddle2.4.2 pip install paddleocr 基本使用 PaddleOCR的使用也很简单&#xff1a; from paddleocr import PaddleOCR# use_angle_cls&#xff1a;是否使用…

高通 8255 基本通信(QUP)Android侧控制方法说明

一&#xff1a;整体说明 高通8255芯片中&#xff0c;SPI IIC UART核心统一由QUP V3 进行控制 QUP V3为可编程模块&#xff0c;可以将不同通道配置为SPI IIC UART通路&#xff0c;此部分配置在QNX侧 QUP 资源可以直接被QNX使用&#xff0c;Android侧可以通过两种方法使用QUP资源…

Android Audio相关

AudioManager AudioService的Bp端&#xff0c;调用AudioManager>AudioService&#xff08;代码实现&#xff09; AudioService 继承自IAudioService.Stub&#xff0c;为Bn端 AudioSystem AudioService功能实现都依赖于AudioSystem&#xff0c;AudioService通过AudioSys…

SCXI-1193 控制器 多路复用器开关模块 NI 仪器仪表 SCXI-1001

规范 SCXI -1193 500 MHz四路8x1 50多路复用器 本文件列出了SCXI-1193多路复用器模块的规格。所有规格均为 如有变更&#xff0c;恕不另行通知。请访问ni.com/manuals了解最新规格。 配置四路8x1多路复用器 双通道16x1多路复用器 单路32x1多路复用器 四路4x1端接多路复用器 双路…

Java Swing游戏开发学习15

内容来自RyiSnow视频讲解 这一节讲的是Title Screen&#xff0c;直译&#xff1a;标题屏幕。视频开始没有字幕了&#xff0c;比较考验听力[/doge]&#x1f436;&#xff0c;常听到不认识的单词&#xff0c;一边猜&#xff0c;一边琢磨意思。作者说有许多人讨论如何实现non-gam…

地理数据表达方式学习——KML与SHP

一、KML-Keyhole Markup Language Keyhole Markup Language (KML)是一种XML符号&#xff0c;用于浏览器中二维地图和三维地球的地理注释和地理可视化&#xff08;地理数据包括点、线、面、多边形、多面体以及模型等&#xff09;。KML是伴随着Google Earth的使用而开发的&#x…

ROS机器人入门第一课:ROS快速体验——python实现HelloWorld

文章目录 ROS机器人入门第一课&#xff1a;ROS快速体验——python实现HelloWorld一、HelloWorld实现简介&#xff08;一&#xff09;创建工作空间并初始化&#xff08;二&#xff09;进入 src 创建 ros 包并添加依赖 二、HelloWorld(Python版)&#xff08;二&#xff09;进入 r…

Doris实战——工商信息查询平台的湖仓一体建设

目录 前言 一、架构1.0&#xff1a;传统Lambda架构 二、OLAP引擎调研 三、架构2.0&#xff1a;数据服务层All in Apache Doris 四、架构 3.0&#xff1a;基于Doris Multi-Catalog的湖仓一体架构 五、实践经验 5.1 引入Merge-on-Write&#xff0c;百亿级单表查询提速近三…

好用的客服快捷回复软件推荐

在当今快节奏的商业环境中&#xff0c;客户服务的效率和质量已经成为企业成功的关键因素之一。对于客服工作人员来说&#xff0c;面对海量的客户咨询和问题解答&#xff0c;如何快速而准确地回复&#xff0c;成为了他们日常工作中的一大挑战。选择一款好用的快捷回复工具是非常…

如何做人才运营战略?

招聘人才和人才获取是同义词&#xff0c;但它们并不相同。招聘是大多数雇主的短期解决方案&#xff0c;而人才获取是一个长期解决方案。 企业要想改善企业文化朝着统一的愿景努力&#xff0c;就需要关注长期规划。 人才获取vs人才招聘 招聘是为了填补空缺&#xff0c;人才获取…

“人工智能+”平台能力,如何助力企业打造新质生产力?

导读&#xff1a;打造新质生产力&#xff0c;为什么离不开强大的数智平台&#xff1f; 2024年开年&#xff0c;新质生产力成为经济领域的第一热词。 提到新质生产力&#xff0c;很多人会想到以人工智能为代表的科技创新。2024年政府工作报告提出&#xff1a;要“深化大数据、人…

C# 异常捕获

文章目录 C# 异常捕获捕获异常运行效果 自定义异常运行结果 抛出异常 C# 异常捕获 捕获异常 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp2 {class Test{int result;Test(){r…

力扣Lc20--- 202.快乐数(java版)-2024年3月20日

1.题目 2.知识点 &#xff08;1&#xff09;while (seen.contains(n) false) { // 循环体 } 与 !seen.contains(n) 等同 &#xff08;2&#xff09; 当传入数字 19 给 isHappy(19) 方法时&#xff0c;下面是每一行代码的执行过程&#xff1a; 初始化一个空的 HashSet&#…