LeetCode215. 数组中的第K个最大元素

题目描述:
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入: [3,2,1,5,6,4], k = 2
输出: 5
示例 2:

输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4

提示:

1 <= k <= nums.length <= 105
-104 <= nums[i] <= 104


解决思路:由于需要时间复杂度为O(n),所以传统的排序算法均不能使用。
在本题中,要求获得的是第K大的元素,并不要求数组要进行完全排序,所以我们可以进行快速排序的变种写法
快速排序有一个特点就是在每一次进行快排之后,就可以确定一个元素的最终位置!!
为了保证稳定性,随机获取集合中的一个元素pivot进行排序,所以我们可以判断比该pivot元素小的元素个数(low.size()),比该pivot元素大的元素个数(above.size()),以及和该pivot元素相等的元素个数(equal.size())
此时我们所知道的是要查找第K大的元素

  1. 如果K小于above.size()时,那么可以确定所需要元素在above集合中,然后在above集合中进行依次变种快排
  2. 如果K大于equal.size()+above.size(),那么说明该元素在low集合中,而且是所要结果low集合中第(K+low.size()-nums.size())大的元素,然后再low集合中进行变种快排
  3. 若以上两种情况均不满足,则说明此时pivot就是我们所需要的第K大的元素

代码如下所示:

class Solution {public int findKthLargest(int[] nums, int k) {List<Integer> temp=new ArrayList<>();for(int i=0;i<nums.length;i++){temp.add(nums[i]);}return quickSort(temp,k);}public int quickSort(List<Integer> temp,int k){//为了稳定性,随机选择一个数Random rand =new Random();int pivot=temp.get(rand.nextInt(temp.size()));int i=0;List<Integer> low=new ArrayList<>();List<Integer> above=new ArrayList<>();List<Integer> equal=new ArrayList<>();while(i<temp.size()){if(temp.get(i)<pivot){low.add(temp.get(i));}else if(temp.get(i)>pivot){above.add(temp.get(i));}else{equal.add(temp.get(i));}i++;}//说明第k大元素,在above集合中if(k<=above.size()){return quickSort(above,k);}//说明第k大元素,在low集合中if(temp.size()-low.size()<k){return quickSort(low,k+low.size()-temp.size());}return pivot;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后端系统开发之——功能完善

原文地址&#xff1a;https://blog.yiming1234.cn/?p830 下面是正文内容&#xff1a; 前言 通过SpringBoot开发用户模块的部分也就差不多要结束了&#xff0c;这一片文章就主要提一些在系统开发中需要注意到的细节部分和功能&#xff0c;也就是剩余的部分。 但是这个专栏只介…

echarts数据下钻如何配置

官方范例&#xff1a;https://echarts.apache.org/examples/zh/editor.html?cbar-multi-drilldown 看了一眼范例直接晕了&#xff0c;你这&#xff0c;一堆数据直接写死&#xff0c;这怎么用啊&#xff01; 一般来说&#xff0c;实现步骤是&#xff1a; 1&#xff09;后台&a…

安达发|电子产品制造企业APS生产排程软件

在电子脉动的世界中&#xff0c;时间是芯片上的电流&#xff0c;效率是电路板上的速度。在这个时代&#xff0c;每一微秒都蕴藏着无限可能&#xff0c;每一决策都关乎着企业的生死存亡。APS生产排程软件&#xff0c;是您的电子制造帝国中的智慧大脑&#xff0c;以卓越的创造力&…

Sqoop【实践 02】Sqoop1最新版 全库导入 + 数据过滤 + 字段类型支持 说明及举例代码(query参数及字段类型强制转换)

Sqoop1最新版举例 1.环境说明2.import-all-tables3.query4.字段类型支持 1.环境说明 还是之前的环境&#xff1a; # 不必要信息不再贴出 # JDK [roottcloud ~]# java -version java version "1.8.0_251" # MySQL [roottcloud ~]# mysql -V mysql Ver 14.14 Distrib…

Vue.js:构建高效且灵活的Web应用的利器

在前端开发领域&#xff0c;Vue.js已经迅速崛起并获得了广大开发者的青睐。作为一个轻量级的JavaScript框架&#xff0c;Vue.js不仅易于上手&#xff0c;而且功能强大&#xff0c;能够帮助开发者快速构建高效且灵活的Web应用。本文将带你深入了解Vue.js的核心概念、特性以及它在…

Reactor设计模式和Reactor模型

Reactor设计模式 翻译过来就是反应堆&#xff0c;所以Reactor设计模式本质是基于事件驱动。 角色 Handle&#xff08;事件&#xff09;EventHandler&#xff08;事件处理器&#xff09;ConcreteEventHandler&#xff08;具体事件处理器&#xff09;Synchronous Event Demult…

CTR之Session行为序列建模用户兴趣:DSIN

在前面的文章中&#xff0c;DIN模型 在用户行为序列建模中引入注意力机制来强调加权与target item相关的行为&#xff0c;以实现动态的兴趣表征&#xff1b;而DIEN模型 则在DIN的基础上加入时间性信息&#xff0c;使用注意力机制的GRU来挖掘用户兴趣的演变。 而今天的这篇文章…

jspssm_maven项目——KTV点歌系统

目录 背景 技术简介 系统简介 界面预览 背景 随着互联网的广泛渗透和进步&#xff0c;基于网络技术的KTV点歌系统迅速壮大&#xff0c;其发展始终围绕用户的实际需求展开。通过深入洞察用户的需求&#xff0c;开发出高度定制的管理平台&#xff0c;利用网络的便捷性对系统…

8.软件工程

整个章节偏向于记忆、背诵&#xff1b; 主要议题&#xff1a; 软件体系&#xff1a;3层&#xff1b; UML重点&#xff0c;重点记3要素中的关系、图&#xff1b; 1.软件体系结构 分层 优点&#xff1a;利于软件的重复利用&#xff1b; 缺点&#xff1a;以什么方式分层&#…

音频RK809

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、目的二、知识准备2.1Audio框架2.1.1 DAI2.1.2 CODEC2.1.3 machine三、原理图3.1 整体原理图3.2 喇叭部分3.3 麦克风部分四、设备树4.1 sound 部分4.2 codec 部分五、驱动讲

用友软件公司面试总结

一、自我介绍 二、质询 1. 对本公司的了解&#xff1f; 2. 身边同学对你的印象&#xff0c;认知、评价&#xff1f; 3. 你觉得身边人的评价符合吗&#xff1f; 4. 你觉得你的优点是什么&#xff1f; 5. 哪里人&#xff1f;会粤语吗&#xff1f; 6. 你对公司有多少了解&a…

使用Urllib库创建第一个爬虫程序

Urllib 是 Python 的标准库&#xff0c;它提供了一系列用于处理 URL 的函数和类&#xff0c;包括发送 HTTP 请求、处理 HTTP 响应、解析 URL 等功能。可以使用 urllib 来编写简单的网络爬虫。 request&#xff1a;它是最基本的HTTP请求模块&#xff0c;可以用来模拟发送请求。只…

【JavaScript 漫游】【044】Web Worker

文章简介 本篇文章为【JavaScript 漫游】专栏的第 044 篇文章&#xff0c;对浏览器模型的 Web Worker 相关知识点进行了总结。 概述 JavaScript 语言采用的是单线程模型&#xff0c;也就是说&#xff0c;所有任务只能在一个线程上完成&#xff0c;一次只能做一件事。前面的任…

设计模式|观察者模式(Observer Pattern)

文章目录 初识观察者模式优缺点示例代码&#xff08;使用 Java 实现&#xff09;有哪些知名的框架采用了观察者模式常见面试题 初识观察者模式 观察者模式&#xff08;Observer Pattern&#xff09;是一种软件设计模式&#xff0c;属于行为型模式。它定义了一种一对多的依赖关…

仿mudo库实现高并发服务器实现文章整合

相关文章实现与转载 (按实际项目流程发布) 时间轮设计-CSDN博客 正则表达式的使用-CSDN博客 bind函数的认识与基本使用-CSDN博客 timerfd的认识与基本使用-CSDN博客 Buffer缓冲区类实现(模块一)-CSDN博客 日志打印宏的编写-CSDN博客 Socket套接字类实现(模块二)-CSDN博…

C#语言规范及特殊用法笔记

前言 记录在学习C#过程中遇到的知识点&#xff0c;会持续更新。 1. 常用数据类型结构的默认值 创建类的一个实例时&#xff0c;在执行构造函数之前&#xff0c;如果没给成员变量赋初始值&#xff0c;C#编译器将每一个成员变量初始化为默认值。虽然C#编译器为每个类型都设置了…

MySQL 8.0.35 企业版开启审计audit log功能

一、系统环境和要求 在MySQL中&#xff0c;开启日志审计可以记录数据库的操作日志&#xff0c;包括修改、删除、插入等操作。这对于追踪和分析数据库的使用情况以及排查潜在的安全问题非常有帮助。本文将详细介绍如何开启MySQL的日志审计功能。 操作系统&#xff1a;Ubuntu 20…

人工智能 框架 paddlepaddle 飞桨 使用指南 使用例子 线性回归模型demo 1

安装过程&使用指南&线性回归模型 使用例子 本来预想 是安装 到 conda 版本的 11.7的 但是电脑没有gpu 所以 安装过程稍有变动,下面简单讲下 conda create -n paddle_env117 python=3.9 由于想安装11.7版本 py 是3.9 所以虚拟环境名称也是 paddle_env117 activa…

6 Spring-AOP

文章目录 1&#xff0c;AOP简介1.1 什么是AOP?1.2 AOP作用1.3 AOP核心概念 2&#xff0c;AOP入门案例2.1 需求分析2.2 思路分析2.3 环境准备2.4 AOP实现步骤步骤1:添加依赖步骤2:定义接口与实现类步骤3:定义通知类和通知步骤4:定义切入点步骤5:制作切面步骤6:将通知类配给容器…

数据库SQLSever——数据查询

一、无条件查询 查询表的所有信息 SELECT * FROM 表名 例&#xff1a;查询学生表 SELECT * FROM student087 二、根据列名查询 根据列名查询表信息 SELECT [列名],[列名],.... FROM 表名 例&#xff1a;查询学生表的学生学号和姓名 SELECT SNO&#xff0c;SNAME FROM STU…