【LeetCode】【算法】215. 数组中的第K个最大元素

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

题目描述

给定整数数组 nums 和整数 k,请返回数组中第k个最大的元素。
请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。
你必须设计并实现时间复杂度为O(n)的算法解决此问题。
示例:
输入: [3,2,1,5,6,4], k = 2
输出: 5

思路

思路:基于快速排序来做,第K个最大元素也就是从小到大的第nums.length-K个元素

  1. 每次以最左边的元素为pivot,对数组进行排序;
  2. 如果恰巧这个pivot最后的交换位置就是nums.length-K,那就可以找到这个元素了;
  3. 不满足上述条件的话,若交换位置loc<nums.length-K,则在[0,nums.length-K-1]中找;否则在[nums.length-K+1,nums.length-1]中找

代码

class Solution {public void swap(int[] nums, int i, int j){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}public int quickSortFast(int[] nums, int left, int right, int k){// 让最左侧数字作为pivotint partition = nums[left];// 定义变量用于双路快排int l = left + 1, r = right;// 进行快排的操作while (true) {while (l <= r && nums[l] < partition) l++;while (r >= l && nums[r] > partition) r--;if (l > r) break;swap(nums, l, r);l++;r--;}// 交换回来swap(nums, left, r);// 如果不是第k大,继续递归if (r < k){return quickSortFast(nums, r + 1, right, k);} else if (r > k){return quickSortFast(nums, left, r - 1, k);} else {return partition;}}public int findKthLargest(int[] nums, int k) {// 基于快排来做/*** 快排思想:* 1. 选择一个随机置作为pivot* 2. 以这个pivot为边界,区分出左和右* 3. 判断pivot是否是第k大的,如果不是第k大的,根据当前所处的位置index,判断往左边找还是往右边找* 4. 循环以上思路得到最后结果* */// 最后输入nums.length - k,是因为实际上上面是求从小->大第k个元素// 要求第k大的元素,实际上就是从小->大第nums.length - k个元素return quickSortFast(nums, 0, nums.length - 1, nums.length - k);}
}

注意这里快速排序用了一个东西叫做双路快排,但是核心思想并不难。初始化是l=left+1,r=right,也就是速度两端,接着用一个while(true)做循环,在循环内部判断if(l>r)则跳出循环
在循环内部,对于l,找到nums[l]>partition的数,等待做交换,故while(l<r&&nums[l]<partition) l++;
在循环内部,对于r,找到nums[i]<partition的数,等待做交换,故while(l<r&&nums[r]>partition) r--;
:上面两个循环实际上就是为了找到从左边起第一个比partition大的数、和右边起第一个比partition小的数做交换。比起普通的一个一个遍历看是否交换节省了不少时间,因为这里相当于一个双指针的操作
找到了以后,交换lr位置上的值:swap(nums,l,r)
最后l++,r--,让两个指针往下一个位置移动

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

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

相关文章

现代Web开发:React Hooks深入解析

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 现代Web开发&#xff1a;React Hooks深入解析 现代Web开发&#xff1a;React Hooks深入解析 现代Web开发&#xff1a;React Hook…

RTC精度及校准

RTC精度偏差&#xff1a; RTC的基准时间和精度与石英晶体的频率相关&#xff0c;晶体的谐振频率取决于温度&#xff0c;因此RTC性能与温度相关&#xff0c;晶体的频率偏差是晶体正常频率的温度反转函数。 一、硬件方面&#xff1a; 1.使用高精度振荡器的RTC模块&#xff1b; …

MongoDB 基础与应用

一、引言 在当今的数据驱动时代&#xff0c;数据库的选择对于应用程序的性能和可扩展性至关重要。MongoDB 作为一种流行的非关系型数据库&#xff0c;以其灵活的数据模型、强大的可扩展性和高可用性&#xff0c;受到了广泛的关注和应用。对于 Javaer来说&#xff0c;了解 Mongo…

了解bootstrap改造asp.net core MVC的样式模板

我们都知道&#xff0c;在使用默认的asp.net core MVC模板建立项目的时候&#xff0c;里面的样式是已经事先被写好了的。一般来说都在css目录下的site.css和bootstrap.css及下面的bootstrap.min.css中。我们打开bootstrap这些样式文件&#xff0c;里面有大量的样式类的定义&…

流类库与输入输出

来源&#xff1a;《C语言程序设计》 像C语言一样&#xff0c;C语言也没有输入输出语句。 但C标准库中有一个面向对象的输入输出软件包&#xff0c;即I/O流类库。 流是I/O流类的中心概念。 ------ I/O流类库是C语言中I/O函数在面向对象的程序设计方法中的一个替换产品。 -…

cocos creator 3.8.3物理组件分组的坑

坑&#xff0c;坑的不行的大坑 group用的二进制的左移获取十进制的数值 目前是这样判断的&#xff0c;也不知道对不对&#xff0c;什么get、set Group没找到

hhdb数据库介绍(9-4)

访问安全 权限体系 计算节点有两类用户&#xff0c;一类是计算节点数据库用户&#xff0c;用于操作数据&#xff0c;执行SELECT&#xff0c;UPDATE&#xff0c;DELETE&#xff0c;INSERT等SQL语句。另一类是关系集群数据库可视化管理平台用户&#xff0c;用于管理配置信息。此…

基于MFC实现的赛车游戏

一、问题描述 游戏背景为一环形车道图&#xff0c;选择菜单选项“开始游戏”则可开始游戏。游戏的任务是使用键盘上的方向键操纵赛道上的蓝色赛车追赶红色赛车&#xff0c;红色赛车沿车道顺时针行驶&#xff0c;出发点和终点均位于车道左上方。任一赛车先达到终点则比赛结束。…

RHCE的学习(12)

第九章 Ubuntu 什么是Ubuntu 概述 Ubuntu&#xff08;乌班图&#xff09;属于Debian系列&#xff0c;Debian是社区类Linux的典范&#xff0c;是迄今为止最遵循GNU规范的Linux系统。 Debian最早由Ian Murdock于1993年创建&#xff0c;分为三个版本分支&#xff08;branch&…

【案例】故障雪花屏

开发平台&#xff1a;Unity 6.0 开发工具&#xff1a;Shader Graph 参考视频&#xff1a;【U2D Shader Graph】❄️雪❄️花❄️屏❄️   一、效果图 二、Shader Graph 路线图 三、案例分析 核心思路&#xff1a;雪花屏幕效果 &#xff08;混合&#xff09; 原图像 最终图像…

图像手动标注-labelme+yolo格式导出

conda环境 运行以下命令来激活你的虚拟环境&#xff1a; conda activate labelme如果你没有创建 labelme 环境&#xff0c;首先需要创建一个环境并安装 labelme&#xff1a; conda create -n labelme python3.8 conda activate labelme conda install -c conda-forge labelm…

有什么办法换网络ip动态

在数字化时代&#xff0c;网络已成为我们生活、工作不可或缺的一部分。然而&#xff0c;随着网络应用的日益广泛&#xff0c;IP地址作为设备在网络中的唯一标识&#xff0c;其重要性不言而喻。动态换IP&#xff0c;作为一种灵活且高效的网络技术&#xff0c;正逐渐受到越来越多…

unity实习生面试

北京教育中厂的成都分部 11.5 时长有28分钟 一面二面合并了 面试官人挺好的&#xff0c;也不是特别急&#xff0c;答的不是很好的问题面试官直接跳过了 顺序不是很统一 只写记得的部分 1.问了值类型和引用类型的区别 2. 问了ugui的组件有哪些 ugui有哪些优化方案 答用打图集…

Spring Boot中集成MyBatis操作数据库详细教程

目录 前言1. 项目依赖配置1.1 引入MyBatis和数据库驱动依赖1.2 数据源配置 2. 创建数据库映射实体类3. 创建Mapper层接口4. 创建Service层4.1 定义Service接口4.2 实现Service接口 5. 创建Controller层6. 运行和测试项目6.1 启动项目6.2 测试接口 7. 总结 前言 在Java开发中&a…

OpenCV相机标定与3D重建(2)鱼眼相机模型

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 鱼眼相机是一种具有非常宽视野的相机&#xff0c;通常会产生强烈的径向畸变。鱼眼相机模型旨在捕捉这种畸变&#xff0c;以便能够准确地处理和校…

Matplotlib 绘图艺术:从新手到高手的全面指南

引言 在数据科学和机器学习领域&#xff0c;数据可视化是一项至关重要的技能。一个优秀的可视化图表可以直观地展示数据的内在规律&#xff0c;帮助我们更好地理解数据&#xff0c;并做出更明智的决策。而在众多的绘图库中&#xff0c;Matplotlib 是 Python 中最强大、最灵活的…

【大语言模型】ACL2024论文-07 BitDistiller: 释放亚4比特大型语言模型的潜力通过自蒸馏

【大语言模型】ACL2024论文-07 BitDistiller: 释放亚4比特大型语言模型的潜力通过自蒸馏 目录 文章目录 【大语言模型】ACL2024论文-07 BitDistiller: 释放亚4比特大型语言模型的潜力通过自蒸馏目录摘要研究背景问题与挑战如何解决创新点算法模型实验效果代码推荐阅读指数&…

RocketMQ部署教程

拉取 RocketMQ 镜像&#xff1a; 首先&#xff0c;从 Docker Hub 获取最新的 RocketMQ 镜像&#xff1a; docker pull apache/rocketmq:latest创建 Docker 网络&#xff1a; 为了使各容器之间能够通信&#xff0c;创建一个名为 rocketmq 的网络&#xff1a; docker network cre…

ORACLE批量插入更新如何拆分大事务?

拆分大事务 一、批量插入更新二、拆分事务之前文章MYSQL批量插入更新如何拆分大事务?说明了Mysql如何拆分,本篇文章探讨Oracle或OceanBase批量插入更新拆分大事务的问题 一、批量插入更新 oracle批量插入更新可使用merge语法eg: merge test ausing test_tmp bon (a.id = b.id…

鸿蒙next打包流程

目录 下载团结引擎 添加开源鸿蒙打包支持 打包报错 路径问题 安装DevEcoStudio 可以在DevEcoStudio进行打包hap和app 包结构 没法直接用previewer运行 真机运行和测试需要配置签名,DevEcoStudio可以自动配置, 模拟器安装hap提示报错 安装成功,但无法打开 团结1.3版本新增工具…