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

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前面@Overridepublic 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++) {//大小为kminHeap[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;}
}

相关文章:

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

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 解题思路&#xff1a;时间复杂度O( n n n)&#xff0c;空间复杂度…...

Springboot 整合 Knife4j (API文档生成工具)

目录 一、Knife4j 介绍 二、Springboot 整合 Knife4j 1、pom.xml中引入依赖包 2、在application.yml 中添加 Knife4j 相关配置 3、打开 Knife4j UI界面 三、关于Knife4j框架中常用的注解 1、Api 2、ApiOperation ​3、ApiOperationSupport(order X) ​4、ApiImplici…...

C语言---------strlen的使用和模拟实现

字符串是以‘\0’作为结束标志&#xff0c;strlen函数的返回值是‘\0’前面的字符串的个数&#xff08;不包括‘\0’&#xff09; 注意 1&#xff0c;参数指向的字符串必须以‘\0’结束 2&#xff0c;函数的返回值必须以size_t,是无符号的 使用代码 ​ #include<stdio.…...

【MATLAB源码-第168期】基于matlab的布谷鸟优化算法(COA)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 布谷鸟优化算法&#xff08;Cuckoo Optimization Algorithm, COA&#xff09;是一种启发式搜索算法&#xff0c;其设计灵感源自于布谷鸟的独特生活习性&#xff0c;尤其是它们的寄生繁殖行为。该算法通过模拟布谷鸟在自然界中…...

集合深入------理解底层。

集合的使用 前提&#xff1a;栈、堆、二叉树、hashcode、toString()、quesalus()的知识深入和底层理解。 1、什么是集合 集合就是咋们所说的容器 ​ 前面我们学习过数组 数组也是容器 ​ 容器&#xff1a;装东西的 生活中有多少的容器呀? 水杯 教室 酒瓶 水库 只要是…...

【阅读笔记】《硬笔书法艺术》

硬笔书法基础教程&#xff0c;也介绍了一些实用案例 作者: 万应均 出版社: 湖南人民出版社 笔记 CH1 运笔方式 起笔&#xff1a;起笔、切笔、顺峰、搭峰。 行笔&#xff1a;提笔、按笔、滑笔、转笔、折笔。 收笔&#xff1a;提收、顿收、折收。 CH2 钢笔楷书 “古人善书者…...

5.5.5、【AI技术新纪元:Spring AI解码】使用PGvector设置向量存储及进行相似性搜索

使用PGvector设置向量存储及进行相似性搜索 本节指导您如何设置PGvector VectorStore来存储文档嵌入并执行相似性搜索。 PGvector是一个开源的PostgreSQL扩展,能够支持存储和搜索机器学习生成的嵌入向量,提供查找精确和近似最近邻的功能。它设计得与PostgreSQL的其他特性无…...

EDR下的线程安全

文章目录 前记进程断链回调执行纤程内存属性修改early birdMapping后记reference 前记 触发EDR远程线程扫描关键api&#xff1a;createprocess、createremotethread、void&#xff08;指针&#xff09;、createthread 为了更加的opsec&#xff0c;尽量采取别的方式执行恶意代…...

洛谷刷题 | B3623 枚举排列

枚举排列 题目描述 今有 n n n 名学生&#xff0c;要从中选出 k k k 人排成一列拍照。 请按字典序输出所有可能的排列方式。 输入格式 仅一行&#xff0c;两个正整数 n , k n, k n,k。 输出格式 若干行&#xff0c;每行 k k k 个正整数&#xff0c;表示一种可能的队…...

程序员35岁会失业吗?

程序员35岁会失业吗&#xff1f; 35岁被认为是程序员职业生涯的分水岭&#xff0c;许多程序员开始担忧自己的职业发展是否会受到年龄的限制。有人担心随着年龄的增长&#xff0c;技术更新换代的速度会使得资深程序员难以跟上&#xff1b;而另一些人则认为&#xff0c;丰富的经…...

RabbitMQ 安装保姆级教程

目录 1.MQ引言 1.1 什么是MQ 1.2 MQ有哪些 1.3 不同MQ特点 2.RabbitMQ 的引言 2.1 RabbitMQ 2.2 RabbitMQ 的安装 2.2.1 下载 2.2.2 下载的安装包 2.2.3 安装步骤 3. RabiitMQ 配置 3.1RabbitMQ 管理命令行 3.2 web管理界面介绍 3.2.1 overview概览 3.2.2 Admin用…...

【MySQL】InnoDB引擎

逻辑结构 InnoDB存储引擎逻辑结构如图所示&#xff1a; Tablespace&#xff1a;表空间&#xff0c;一个数据库可以对应多个表空间。数据库中的每张表都有一个表空间&#xff0c;用来存放表记录、索引等数据。 Segment&#xff1a;段&#xff0c;表空间中有多个段&#xff0c…...

小白如何兼职赚得第一桶金?六大网络赚钱方式助你轻松开启副业之旅

小白如何兼职赚得第一桶金&#xff1f;六大网络赚钱方式助你轻松开启副业之旅 无需担忧&#xff0c;以下为你精心挑选的六大线上兼职方式&#xff0c;将助你轻松开启副业赚钱之旅。 1&#xff0c;参与网络调查&#xff1a;市场调研公司及品牌商为洞察消费者需求&#xff0c;常…...

富格林:出金不顺谨防虚假受害

富格林悉知&#xff0c;做投资有盈有亏是正常的&#xff0c;投资者需要做的是尽可能降低亏损的风险&#xff0c;警惕虚假出金陷阱&#xff0c;避免造成不必要的亏损。在进入黄金投资市场之前&#xff0c;投资者需学习一定的投资技巧&#xff0c;并且需要采取正规的策略来打击和…...

Saltstack 最大打开文件数问题之奇怪的 8192

哈喽大家好&#xff0c;我是咸鱼。 今天分享一个在压测过程中遇到的问题&#xff0c;当时排查这个问题费了我们好大的劲&#xff0c;所以我觉得有必要写一篇文章来记录一下。 问题出现 周末在进行压测的时候&#xff0c;测试和开发的同事反映压测有问题&#xff0c;请求打到…...

Appium Inspector 展示设备当前页面

定位元素需要使用appium inspector&#xff0c;之前每次都是从登录页开始&#xff0c;后来发现连接设备的时候只需要去掉appPackage、appActivity即可。 { "platformName": "Android", "platformVersion": "6", "deviceNa…...

PyQt:实现菜单栏的点击拖动效果

一、整体步骤 1.设计UI文件 2.调用显示 3.效果展示 二、设计UI文件 1.添加 Scroll Area控件&#xff0c;作为菜单栏的布置区域 2.设置 Scroll Area控件的属性 3.Scroll Area控件内放置 按钮控件 组成菜单栏 此处&#xff0c;放置了需要了6个按钮&#xff0c;并设置按钮的固…...

力扣--并查集547.省份数量

思路分析&#xff1a; 首先定义变量 fa 用于记录并查集&#xff0c;以及城市数量 n。定义了并查集的两个函数&#xff0c;find 用于查找节点的根节点&#xff0c;togother 用于合并两个节点所在的集合。在公共函数 findCircleNum 中&#xff0c;初始化并查集&#xff0c;然后遍…...

leetcode35-Search Insert Position

排序数组搜索某个元素&#xff0c;这种思维一定要往二分法上靠 public class searchInsertPosition{public static void main(String[] args) {int arr[] {1,3,5,6};System.out.println(getIndex(arr,2));}public static int getIndex(int[] arr,int target) {int start 0;i…...

API 接口渗透测试

1 API 接口介绍 1.1 RPC&#xff08;远程过程调用&#xff09; 远程过程调用&#xff08;英语&#xff1a;Remote Procedure Call&#xff0c;缩写为 RPC&#xff09;是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序&#xff0c;而程序员无…...

SimWorks FDTD仿真结果可视化:从监视器数据到专业图表,手把手教你避开插值陷阱

SimWorks FDTD仿真结果可视化&#xff1a;从监视器数据到专业图表&#xff0c;手把手教你避开插值陷阱 电磁仿真工程师们常遇到这样的困境&#xff1a;明明仿真设置无误&#xff0c;计算结果却与预期存在微妙差异。问题的根源往往不在仿真过程本身&#xff0c;而在于后处理阶段…...

LIF蛋白的结构特征与生物学功能研究

一、LIF蛋白的分子结构与分类白血病抑制因子属于IL-6细胞因子家族&#xff0c;是一种多功能的糖蛋白。该蛋白由180个氨基酸残基组成&#xff0c;分子量约为20至25千道尔顿&#xff0c;包含七个α-螺旋结构域&#xff0c;形成典型的上束螺旋结构。LIF蛋白的基因定位于22号染色体…...

实测Qwen-Image-Edit-2511:输入一张图,输出360°环绕视角,效果太强了

实测Qwen-Image-Edit-2511&#xff1a;输入一张图&#xff0c;输出360环绕视角&#xff0c;效果太强了 1. 引言&#xff1a;单图变多视角的技术突破 想象一下&#xff0c;你只需要一张普通的商品照片&#xff0c;就能自动生成360度全方位的展示效果。这不是科幻电影里的场景&…...

【AI】AI安全工具:常用AI安全检测工具的使用教程

AI安全工具&#xff1a;常用AI安全检测工具的使用教程&#x1f4dd; 本章学习目标&#xff1a;本章介绍实用工具&#xff0c;帮助读者掌握AI安全合规治理的工具使用。通过本章学习&#xff0c;你将全面掌握"AI安全工具&#xff1a;常用AI安全检测工具的使用教程"这一…...

重塑暗黑2单机体验:d2s-editor 3大革新功能与技术解析

重塑暗黑2单机体验&#xff1a;d2s-editor 3大革新功能与技术解析 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor d2s-editor 是一款开源的暗黑2存档编辑工具&#xff0c;通过直观的图形界面实现角色属性调整、装备管理和高级合…...

网站爬虫原理,基于浏览器点击行为还原可接口请求

爬虫这个词细节来说本质只有一件事&#xff0c;把浏览器发出的请求&#xff0c;换一种方式再发一遍 问题不是怎么发请求&#xff0c;而是&#xff1a; 请求是怎么构造的参数从哪里来的哪些字段不能少从一个点击动作开始 打开一个网站&#xff0c;例如一个列表页。 执行一个动作…...

Node.js企业级应用部署与运维完整方案:Google Cloud Platform实战指南

Node.js企业级应用部署与运维完整方案&#xff1a;Google Cloud Platform实战指南 【免费下载链接】nodejs-docs-samples Node.js samples for Google Cloud Platform products. 项目地址: https://gitcode.com/gh_mirrors/no/nodejs-docs-samples 想要构建稳定可靠的No…...

从数据小白到战斗大师:GBFR Logs如何帮你玩转《碧蓝幻想:Relink》

从数据小白到战斗大师&#xff1a;GBFR Logs如何帮你玩转《碧蓝幻想&#xff1a;Relink》 【免费下载链接】gbfr-logs GBFR Logs lets you track damage statistics with a nice overlay DPS meter for Granblue Fantasy: Relink. 项目地址: https://gitcode.com/gh_mirrors/…...

4大维度全面掌控Cyber Engine Tweaks:打造专属赛博朋克2077体验

4大维度全面掌控Cyber Engine Tweaks&#xff1a;打造专属赛博朋克2077体验 【免费下载链接】CyberEngineTweaks Cyberpunk 2077 tweaks, hacks and scripting framework 项目地址: https://gitcode.com/gh_mirrors/cy/CyberEngineTweaks &#x1f31f; 引擎核心&#x…...

终极优化指南:NodeSource Node.js 二进制分发版的 Docker 镜像体积与启动速度革命

终极优化指南&#xff1a;NodeSource Node.js 二进制分发版的 Docker 镜像体积与启动速度革命 【免费下载链接】distributions NodeSource Node.js Binary Distributions 项目地址: https://gitcode.com/gh_mirrors/di/distributions NodeSource Node.js 二进制分发版为…...