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

news2024/10/6 16:19:55

 

解题思路:

利用快排的思想,不断地将数组分成若干部分,缩小查找范围,最终找到第 k 大的元素。

1、首先,对数组进行快速排序,使得数组从大到小排序,然后返回排序后的第 k 个元素即可。

2、在快排过程中,我们每次都选择一个基准数,将数组分为两部分,左部分的数都比基准数大,右部分的数都比基准数小。

3、若基准数所在的位置大于 k,说明需要在基准数左侧的区间中寻找第 k 大的数,此时再对左侧区间进行快排;

4、若基准数所在的位置小于 k,说明需要在基准数右侧的区间中寻找第 k 大的数,此时再对右侧区间进行快排。

5、在快排分区过程中,我们随机从待排区间选取一个数作为基准数,这是为了避免在特定情况下时间复杂度退化为 O(n^2)。同时,我们也要注意处理数组下标的边界情况。

时间复杂度:O(n )

1、对 nums 进行快排,快排的时间复杂度为 O(nlog⁡n)

2、在快排过程中,我们只对基于基准数的一侧继续进行递归,因此时间复杂度是线性的,即 O(n)。

空间复杂度:O((logn )

快排递归过程中使用的栈空间决定的,在栈中,而快排的递归深度是 O(log⁡n)。

//215.数组的第k大元素
func findKthLargest(nums []int,k int)int{//定义查找第k大元素的函数
	quickPartition(nums,0,len(nums)-1,k-1) // 对待排数组进行快排分区
	return nums[k-1]//返回排序后的第k大元素
}
//定义快排分区函数,输入参数为待排序数组,待排区间的左右边界和目标位置
func quickPartition(nums []int,left,right,target int){
	rand.Seed(time.Now().UnixNano())//以当前时间为种子生成随机数
	random:=rand.Int()%(right-left+1) +left//生成在待排区间内的随机数//如果rand.Int()返回的随机整数为33,则rand.Int()%(9)的结果就是33%9=6。
    // random:=rand.Intn(right-left+1) +left
	privot:=nums[random]//以随机数为下标,用该随机数下标获得的元素作为基准数
	nums[left],nums[random]=nums[random],nums[left]//将待排区间的第一个元素与基准数交换位置
	index:=left//初始化index为待排区间左端点

	for i:=left+1;i<=right;i++{//从待排区间的第二个元素开始,依次与基准数比较大小,将比基准数大的元素放到待排区间的前面
		if nums[i]>=privot{
			index++
			//比基数大的放在左边,比基数小保留在已排序的元素序列的右侧,等待下一轮与更大的元素交换位置。
			nums[index],nums[i]=nums[i],nums[index]
		}
	}
	//最后,循环结束时,已经把比基数大的元素放在左边,比基数小的元素放在右边。
	//这时候要把基数放在正确的位置,基数是左边大元素中的最小值,要把基数放在这些大元素的末尾,
	//即要跟排好的最后一个大元素nums[index]交换位置
	//这时候我们不用管基数左右两边的数是否排好序,因为基数左边的数都是比他大的,右边的都是比他小的,
	//所以index位置的基数就是左边大元素的最小数,可以判断出它现在处于数组的第几个最大元素
	nums[index],nums[left]=nums[left],nums[index]
	//然后再去判断是不是我们要的第k大,如果当前index比第k大的数还小,那么第k大在index的左边,继续在基数左边的数组里分区
	//如果当前index比第k大的数还大,那么第k大在index的右边,继续在基数右边的数组里分区

     if index<target{
		quickPartition(nums,index+1,right,target)
	}else if index>target {
		quickPartition(nums,left,index-1,target)
	}
}

 

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

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

相关文章

关于window.print打印分页功能

平常window.print分页一般打印时用到page-break-after:always; 打印的样式设置在 <style type"text/css" media"print"></style>进行设置 但现在我想动态打印分页&#xff0c;即内容一页时打印一页&#xff0c;内容两页时打印两页。。。 现…

HBase 写入数据(Scala代码)

代码如下》》 package Flink_HBase_APLimport org.apache.hadoop.hbase.{HBaseConfiguration, TableName} import org.apache.hadoop.hbase.client.{ConnectionFactory, Put} import org.apache.hadoop.hbase.util.Bytesobject this_one {def main(args: Array[String]): Unit…

开源即时通讯IM框架MobileIMSDK的Uniapp端开发快速入门

► 相关链接&#xff1a; ① MobileIMSDK-Uniapp端的详细介绍② MobileIMSDK-Uniapp端的开发手册new&#xff08;* 精编PDF版&#xff09; 一、理论知识准备 您需要对Uniapp和Vue开发有所了解&#xff1a; 1&#xff09;Uniapp 官方入门教程2&#xff09;可能是最好的 unia…

MyBatis Plus 拦截器实现数据权限控制

一、介绍 上篇文章介绍的MyBatis Plus 插件实际上就是用拦截器实现的&#xff0c;MyBatis Plus拦截器对MyBatis的拦截器进行了包装处理&#xff0c;操作起来更加方便 二、自定义拦截器 2.1、InnerInterceptor MyBatis Plus提供的InnerInterceptor接口提供了如下方法&#x…

SpringCloud 集成 Eureka Server

SpringCloud 集成 Eureka Server 1 pom.xml2 application.yml3 appliction.java4 启动 Eureka的优点&#xff1a; 简单易用&#xff1a;Eureka设计简单&#xff0c;容易上手和部署。 高可用性&#xff1a;Eureka支持高可用性配置&#xff0c;通过使用多个Eureka服务器实例来提…

IEEE Robotics and Automation Letters(RA-L)与ICRA投稿

一 总体感受 RAL不愧未短平快的论文&#xff0c;从接收论文、送审和复审都相当快&#xff0c;我的两个多月出最终接收结果&#xff0c;期刊官网规定6个月内出最终结果。作为现在IEEE主推的短文&#xff0c;限制在8页以内&#xff0c;在6页以上时超页费为175刀/页&#xff0c;目…

平台使用篇 | 批处理(bat)脚本使用教程(二)

导读 BAT脚本提供了一种快速且有效的自动化方式&#xff0c;使用户能够更轻松地处理大量的任务&#xff0c;并且可以根据需要自由地调整和修改脚本。本讲简要介绍了批处理技术及其常用命令。本篇教程主要对批处理技术的语言特点和编程思路进行重点讲解。 RflySim平台更多学习资…

Flutter-Drawer使用

drawer Drawer是Android开发中Material风格常用的设计&#xff0c;就是我们常说的“抽屉”效果&#xff0c;一个从侧边栏拉出来的导航面板。 在Flutter使用Material风格&#xff0c;最为常用的组件之一就是Scaffold了&#xff1b;Scaffold的drawer属性是一个Widget类型的组件&…

Red Hat重置root密码

目录 前言 1、使用rd.break参数重置root密码 2、使用安装盘重置root密码 前言 我们有时会忘记linux系统的root密码&#xff0c;有的不会重置密码只能重置系统了&#xff0c;下面介绍两种重置root密码的方法 1、使用rd.break参数重置root密码 1、启动系统&#xff0c;并在…

将有序数组转换为二叉树

md这个破CSDN模板怎么没了&#xff0c;编辑器也死难用&#xff0c;气死 1、题目 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不…

如何免费使用ChatGPT,提高开发效率?以开发者的角度ChatGPT能做什么?

一、如何免费使用ChatGPT 1&#xff09;登录openai官网https://openai.com/&#xff0c;注册账号后获取免费体验&#xff1b;但目前已经很难成功注册openai账号了&#xff0c;需要魔法上网的同时代理不能使用香港、俄罗斯等地区&#xff0c;需要国外邮箱和国外手机号&#xff…

企业用友NC软件被locked勒索病毒攻击,如何恢复nchome配置文件

近日&#xff0c;用友NC系统遭受了一次严重的勒索病毒攻击&#xff0c;导致许多企业的数据和配置文件被锁定。其中&#xff0c;NC Home配置文件也受到了影响&#xff0c;给企业带来了不小的损失。那么&#xff0c;在这种情况下&#xff0c;如何恢复NC Home配置文件呢&#xff1…

一个动作,直接盘活死仓库!实现效益增长200%!(附完整模板)

有人说&#xff1a;看一家工厂管理到不到位&#xff0c;看下他的仓库就知道了。 仓库作为企业存储和保管物料的重要场所&#xff0c;其管理的好坏直接影响着企业的生产与销售环节&#xff01; 我拜访过很多制造型企业&#xff0c;他们的仓库或多或少都存在以下问题—— 物料…

Hadoop的HDFS文件系统

Hadoop的HDFS文件系统 概述 Hadoop的HDFS文件系统是一种分布式文件系统&#xff0c;hadoop的核心组件之一。它的设计目标是能够在普通硬件上运行&#xff0c;并且能够处理大量的数据。HDFS采用了主从&#xff08;Master/Slave&#xff09;架构&#xff0c;其中有一个NameNode…

Adobe打印转PDF字体出错问题解决方案

错误现象 通过adobe pdf打印转换pdf时&#xff0c;不能够转换成功&#xff0c;只能弹出一个**.txt 打印——选择Adobe pdf——打印&#xff0c;txt中的内容如下&#xff1a; %%[ ProductName: Distiller ]%% %%[ Error: TT8E96441DtCID cannot be embedded because of licensi…

2023年美国大学生数学建模竞赛D题联合国可持续发展目标的优先次序解题全过程文档及程序

2023年美国大学生数学建模竞赛 D题 联合国可持续发展目标的优先次序 原题再现&#xff1a; 背景   联合国(UN)制定了17 项可持续发展目标(SDGs)。实现这些目标将最终改善世界各地许多人的 生活。这些目标不是相互独立的。因此&#xff0c;在某些目标上的积极收获通常会对其…

FM33A048B CRC

概述 循环冗余校验(Cyclic Redundancy Check&#xff0c;CRC)是最为常用的计算机和仪表数据通信的校验方法&#xff0c;FM33A048B中CRC计算单元为完全独立模块&#xff0c;通过软件控制可进行7816、I2C、UART和SPI模块有串行数据流接口的收发CRC计算和校验&#xff0c;也可进行…

二、搭建Kubernetes集群---2.1 搭建Kubernetes环境平台规划和部署方式介绍

二、搭建Kubernetes集群 2.1 搭建Kubernetes环境平台规划和部署方式介绍 2.1.1 搭建Kubernetes环境平台规划 如何安排Master、node。我们已经知道Kubernetes架构的组件共有两大部分&#xff0c;Master和node&#xff0c;因此这里的搭建我们可以分为两个部分&#xff0c;单Ma…

Vue3 + vite npm run build 后 html文件的srcipt标签不加type=module属性的js文件没有被打包

引言 &#xff1a;最近开发一个公司的官网项目&#xff0c;由于公司没有 UE&#xff0c; 领导就直接找了一个JQuery bootstrap 的项目模板要求在最快的时间里面把这个项目放到Vue框架里面。这个项目模板里面各种动画、图表都是引入的JQery插件&#xff0c;这就导致了&#xff…

vue通过缓存请求数据提高首界面展示效率

我在组件中编写了这样一段代码 <template><div class "appp"><button click "getUser">请求数据</button></div> </template><script> import axios from "axios"; export default {data() {retur…