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

[Leetcode 215][Medium]-数组中的第K个最大元素-快排/小根堆/堆排序

一、题目描述

原题地址

二、整体思路

(1)快排

                对于SELECT K问题,可以通过三路快排解决,快排可以把一个元素放至按升序排序的数组正确的位置,左边为小于该元素的元素集合,右边为大于该元素的元素集合。

三路快排把数组分成三部分:

 [l,l2-1]:<nums[l]的元素区间;[l2,r2-1]:=nums[l]的元素区间;[r2,r]:>nums[l]的元素区间;

当k位于[l2,r2-1]区间时,说明数组中[l2,r2-1]区间的元素都放置到正确的位置,k在其中说明k所指的元素已经排序至正确位置,可以返回。

当k位于[l,l2-1]区间时,说明还需要对[l,l2-1]进行快速排序,同理当k位于[r2,r]区间时,说明要对[r2,r]进行快速排序。

(2)小根堆

                要选择第K个最大元素,则可以把该数组[0,k-1]的部分转化为小根堆,遍历[k,nums.length-1]的部分,若遍历到的元素大于堆顶元素,则可以交换此两元素,然后对新的堆顶元素进行siftDown下沉操作,重复上述步骤,最终可以得到前K个最大元素组成的小根堆,堆顶即为第K大的元素。

(3)原地堆排序、大根堆

                对整个数组进行堆排序形成大根堆。把堆顶元素与数组末尾元素进行交换,这样可以得到第一大的元素。把新的堆顶元素在[0,nums.length-1)处进行siftdown()下沉操作,此时的堆顶元素即为数组第二大的元素,那么又可以与数组的[nums.length-2]元素进行交换得到新的堆。重复上述步骤直到得到数组第K大的元素。

三、代码

//快排
class Solution {public int findKthLargest(int[] nums, int k) {Random random=new Random();quicksort(nums,0,nums.length-1,nums.length-k,random);return nums[nums.length-k];}public void quicksort(int[] nums,int l,int r,int k2,Random random){if(l>=r) return;//把nums[l]与数组中随机位置的元素进行交换//防止快排退化导致时间复杂度增加int p=random.nextInt(r-l+1)+l;int temp3=nums[l];nums[l]=nums[p];nums[p]=temp3;int i=l+1,l2=l,r2=r+1;while(i<r2){
//[l,l2]:<nums[l]元素区间;[l2+1,i-1]:=nums[l]元素区间;[r2,r]:>nums[l]//元素区间if(nums[i]<nums[l]){int temp=nums[++l2];nums[l2]=nums[i];nums[i]=temp;i++;}else if(nums[i]>nums[l]){int temp4=nums[--r2];nums[r2]=nums[i];nums[i]=temp4;}else{i++;}}
//最后把nums[l]与nums[l2]交换int temp2=nums[l];nums[l]=nums[l2];nums[l2]=temp2;
//区间发生变化。[l,l2-1]:<;[l2,r2-1]:=;[r2,r]:>if(k2>=l2 && k2<=r2-1) return;else if(r2<=k2) quicksort(nums,r2,r,k2,random);else quicksort(nums,l,l2-1,k2,random);}
}
//小根堆
class Solution {public int findKthLargest(int[] nums, int k) {//把数组[0,k-1]的部分化为小根堆for(int i=(k-2)/2;i>=0;i--){siftDown(nums,i,k);}//遍历数组剩下部分,同时把小根堆堆顶替换为更大的数组元素并对新堆顶执行下沉操作for(int i=k;i<nums.length;i++){if(nums[i]>nums[0]){int temp=nums[i];nums[i]=nums[0];nums[0]=temp;siftDown(nums,0,k);}}return nums[0];//此时小根堆代表前K大的元素,堆顶表示第K大的元素}public void siftDown(int[] arr,int i,int n){while((i*2+1)<n){int j=i*2+1;if(j+1<n && arr[j+1]<arr[j]) j++;if(arr[i]>arr[j]){int temp2=arr[i];arr[i]=arr[j];arr[j]=temp2;i=j;}else break;}}
}
//堆排序,大根堆
class Solution {public int findKthLargest(int[] nums, int k) {\//把整个数组化为大根堆for(int i=(nums.length-2)/2;i>=0;i--){siftDown(nums,i,nums.length);}int ret=0;//从数组末尾由后到前遍历,交换堆顶元素,把元素从最大元素到最小元素的顺序排序for(int i=nums.length-1,k2=0;i>=0;i--){swap(nums,0,i);siftDown(nums,0,i);k2++;if(k2==k) return nums[i];}return ret;}public void swap(int[] nums,int i,int j){int temp=nums[i];nums[i]=nums[j];nums[j]=temp;}public void siftDown(int[] nums,int i,int n){while((i*2+1)<n){//存在左子结点时int j=i*2+1;if(j+1<n && nums[j+1]>nums[j]) j++;//存在右子节点且右子节点比左子节点更大时if(nums[i]<nums[j]){//较小的儿子节点比当前节点大时,要下沉当前节点swap(nums,i,j);i=j;}else break;}}
}

相关文章:

[Leetcode 215][Medium]-数组中的第K个最大元素-快排/小根堆/堆排序

一、题目描述 原题地址 二、整体思路 &#xff08;1&#xff09;快排 对于SELECT K问题&#xff0c;可以通过三路快排解决&#xff0c;快排可以把一个元素放至按升序排序的数组正确的位置&#xff0c;左边为小于该元素的元素集合&#xff0c;右边为大于该元素的元素集合。 三…...

【栈和队列】常见面试题

文章目录 1.[有效的括号](https://leetcode.cn/problems/valid-parentheses/description/)1.1 题目要求1.2 利用栈解决 2. [用队列实现栈](https://leetcode.cn/problems/implement-stack-using-queues/description/)2.1 题目要求2.2 用队列实现栈 3.[用栈实现队列](https://le…...

关于float浮点值二进制存储和运算精度损失的话题

1.前言 浮点值的存储、运算都可能会带来精度损失&#xff0c;了解精度损失背后的机制原因方便我们更好的了解什么情况下会发生精度损失、什么情况下精度损失较大&#xff0c;以及思考怎么避免或减少精度损失。 2.知识点 &#xff08;1&#xff09;IEEE 754标准 EEE 754标准…...

python爬虫学习记录-请求模块urllib3

&#xff08;文章内容仅作学习交流使用&#xff09; urllib3是一个功能强大、条理清晰&#xff0c;用于HTTP客户端的第三方模块 urllib3-发送网络请求 使用urllib3发送网络请求时&#xff0c;需要先创建PoolManager对象&#xff0c;并使用该对象的request方法发送请求&#…...

谷粒商城实战笔记-133~135-城业务-商品上架-远程上架接口

文章目录 一&#xff0c;谷粒商城实战笔记-133-城业务-商品上架-远程上架接口1&#xff0c;开发目标2&#xff0c;详细设计2.1&#xff0c;提前建立索引2.2&#xff0c;构造批量操作请求参数2.3&#xff0c;使用HighLevelClient调用bulk请求保存数据 二&#xff0c;134-商城业务…...

【React】详解 App.js 文件

文章目录 一、App.js文件的基本结构1. 引入必要的模块2. 定义根组件3. 导出根组件 二、App.js文件的详细解析1. 函数组件与类组件函数组件类组件 2. 使用CSS模块3. 组织子组件4. 管理组件状态使用useState钩子使用state对象 三、App.js文件的最佳实践1. 保持组件的简洁和模块化…...

【ML】self-supervised Learning for speech and Image

【ML】self-supervised Learning for speech and Image 1. self-supervised Learning for speech and Image1.1 自监督学习在语音处理领域的方法及其特点1.2 自监督学习在图像处理领域的方法及其特点 2. Predictive Approach2.1 特点2.2 适用场景 3. contrastive Learning4. 语…...

青岛实训day24(8/8)

一&#xff0e;Python环境准备 1.查看有没有python3 yum list installed |grep python yum list |grep python3 最新安装3.12可以使用源码安装 2.下载安装python3 yum -y install python3 3.查看版本 [rootpython ~]# python3 --version Python 3.6.8 4.进入编辑 [r…...

*算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿

刷题记录 101. 孤岛的总面积DFSBFS 102. 沉没孤岛DFSBFS *103. 水流问题*104. 建造最大岛屿 101. 孤岛的总面积 题目地址 本题要求不与矩阵边缘相连的孤岛的总面积。先将与四个边缘相连的岛屿变为海洋&#xff0c;再统计剩余的孤岛的总面积。无需再标识访问过的结点&#xff…...

设计模式 由浅入深(待完结)

一、设计模式是什么&#xff1f; 设计模式是指在软件开发中&#xff0c;经过验证的&#xff0c;用于解决在特定环境下&#xff0c;重复出现的&#xff0c;特定问题的解决方案。 二、设计模式有哪些&#xff1f; 1. 观察者模式 定义对象间的一种一对多&#xff08;变化&#x…...

(第34天)645、最大二叉树

目录 645、最大二叉树题目描述思路代码 645、最大二叉树 题目描述 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大…...

Python知识点:如何使用Paramiko进行SSH连接与操作

使用Paramiko进行SSH连接与操作可以分为以下几个步骤&#xff1a; 安装Paramiko&#xff1a; 首先需要安装Paramiko库&#xff0c;可以使用pip进行安装&#xff1a; pip install paramiko建立SSH连接&#xff1a; 使用Paramiko连接远程服务器&#xff0c;需要提供服务器的地址、…...

代码随想录算法训练营第六天(一)|242.有效的字母异位词

LeetCode 242 有效的字母异位词 题目&#xff1a; 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 示例 1: 输入: s "anagram&q…...

数据结构 | 考研代码题之顺序表 | 1 查找L中值为e的数据元素若找到则返回其下标,若找不到则返回-1

文章目录 1 题目2 题解 1 题目 假设有一个顺序表 L&#xff0c;其存储的所有数据元素均为不重复的正数&#xff0c;查找L中值为e的数据元素&#xff0c;若找到则返回其下标&#xff0c;若找不到则返回-1。 2 题解 C语言代码&#xff1a; /*假设有一个顺序表 L&#xff0c;其…...

RLVF:避免过度泛化地从口头反馈中学习

人工智能咨询培训老师叶梓 转载标明出处 大模型在不同行业和个人中的广泛应用要求模型能够根据具体的用户反馈进行调整或定制&#xff0c;以满足细微的要求和偏好。虽然通过高层次的口头反馈来指定模型调整非常方便&#xff0c;例如“在给老板起草电子邮件时不要使用表情符号”…...

设计原则与思想-从项目实战中学习设计模式

文章目录 开源项目通过剖析Java JDK源码学习灵活应用设计模式1. 单例模式(Singleton Pattern)示例:`java.lang.Runtime`2. 工厂模式(Factory Pattern)示例:`java.util.Date`3. 观察者模式(Observer Pattern)示例:`java.util.Observable` 和 `java.util.Observer`4. 适…...

python中的类属性、实例属性、类方法、实例方法和静态方法

1. 类属性(类变量)和实例属性(实例变量) 在python中&#xff0c;类中的属性就是定义在类中的变量&#xff0c;简称成员变量&#xff1b;类中的行为就是定义在类中的方法&#xff0c;简称成员方法。成员变量又可分为类变量和实例变量&#xff0c;或者分为类属性和实例属性。成员…...

A股继续底部震荡,探底是否能成功?

真心的给股民朋友提个醒&#xff0c;不管你胆大还是胆怯&#xff0c;盘面上出现了1个反常信号&#xff0c;一起来看看&#xff1a; 1、今天两市低开高走&#xff0c;开始筑底了&#xff0c;任何一个主力&#xff0c;都是在无人问津的熊市布局&#xff0c;而在人声鼎沸的牛市离场…...

NPDP考前怎么复习?NPDP200问PDF版来啦~

距离NPDP下半年考试还有4个月的时间&#xff0c;现在正是备考的黄金期。 以下复习建议~ 01.制定详细计划 首先&#xff0c;根据考试大纲&#xff0c;可以将内容划分为几个模块&#xff0c;如新产品开发流程、市场研究、产品规划等&#xff0c;并为每个模块设定学习目标和时间…...

ajax图书管理项目

bootstrap弹框 不离开当前页面&#xff0c;显示单独内容&#xff0c;让用户操作 功能&#xff1a;不离开当前页面&#xff0c;显示单独内容&#xff0c;供用户操作步骤&#xff1a; 1.引入bootstrap.css和bootstrap.js …...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...