数组中的第K个最大元素,力扣

目录

题目地址:

我们直接看题解吧:

快速理解解题思路小建议:

审题目+事例+提示:

解题方法:

解题分析:

解题思路:


题目地址:

215. 数组中的第K个最大元素 - 力扣(LeetCode)

难度:中等

今天刷,大家有兴趣可以点上面链接,看看题目要求,试着做一下

题目:

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

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

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

我们直接看题解吧:

快速理解解题思路小建议:

可以先简单看一下解题思路,然后照着代码看思路,会更容易理解一些。

审题目+事例+提示:

这里可以将题目理解为 求数组中第 K大 的元素

解题方法:

方法1 快速排序

方法2 堆排序

方法3 使用内置排序算法(了解)

解题分析:

快速排序的核心包括“哨兵划分” 和 “递归” 。

哨兵划分: 以数组某个元素(一般选取首元素)为基准数,将所有小于基准数的元素移动至其左边,大于基准数的元素移动至其右边。


递归: 对 左子数组 和 右子数组 递归执行 哨兵划分,直至子数组长度为 1 时终止递归,即可完成对整个数组的排序。

下图展示了数组 [2,4,1,0,3,5] 的快速排序流程。

解题思路:

设 N为数组长度。根据快速排序原理,如果某次哨兵划分后,基准数的索引正好是 N−k,则意味着它就是第 k大的数字 。此时就可以直接返回它,无需继续递归下去了。

然而,对于包含大量重复元素的数组,每轮的哨兵划分都可能将数组划分为长度为 1 和 n−1的两个部分,这种情况下快速排序的时间复杂度会退化至 O(N2)  。

一种解决方案是使用「三路划分」,即每轮将数组划分为三个部分:小于、等于和大于基准数的所有元素。这样当发现第 k 大数字处在“等于基准数”的子数组中时,便可以直接返回该元素。

为了进一步提升算法的稳健性,我们采用随机选择的方式来选定基准数。

代码实现(快排):

public class Solution {private int quickSelect(List<Integer> nums, int k) {// 随机选择基准数Random rand = new Random();int pivot = nums.get(rand.nextInt(nums.size()));// 将大于、小于、等于 pivot 的元素划分至 big, small, equal 中List<Integer> big = new ArrayList<>();List<Integer> equal = new ArrayList<>();List<Integer> small = new ArrayList<>();for (int num : nums) {if (num > pivot)big.add(num);else if (num < pivot)small.add(num);elseequal.add(num);}// 第 k 大元素在 big 中,递归划分if (k <= big.size())return quickSelect(big, k);// 第 k 大元素在 small 中,递归划分if (nums.size() - small.size() < k)return quickSelect(small, k - nums.size() + small.size());// 第 k 大元素在 equal 中,直接返回 pivotreturn pivot;}public int findKthLargest(int[] nums, int k) {List<Integer> numList = new ArrayList<>();for (int num : nums) {numList.add(num);}return quickSelect(numList, k);}
}

代码实现(堆排):

class Solution {
public:void adjMinHeap(vector<int>& nums, int root, int heapsize) {int left = root * 2 + 1, right = root * 2 + 2, minimum = root;if (left < heapsize && nums[left] < nums[minimum])minimum = left;if (right < heapsize && nums[right] < nums[minimum])minimum = right;if (minimum != root) {swap(nums[minimum], nums[root]);adjMinHeap(nums, minimum, heapsize);}}void buildMinHeap(vector<int>& nums, int k) {for (int i = k / 2 - 1; i >= 0; i--)adjMinHeap(nums, i, k);}int findKthLargest(vector<int>& nums, int k) {buildMinHeap(nums, k);for (int i = k; i < nums.size(); i++) {if (nums[i] < nums[0])continue;swap(nums[0], nums[i]);adjMinHeap(nums, 0, k);}return nums[0];}
};

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

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

相关文章

ChatGPT的逆袭历程:核心技术深度解析

在ChatGPT问世之前&#xff0c;已有许多大模型存在&#xff0c;但为何只有它成为了AI时代的“iPhone时刻”&#xff1f;这不仅得益于其技术优势&#xff0c;还在于其发展过程中所采用的一系列创新策略。本文将深度复盘ChatGPT的逆袭历程&#xff0c;分析其核心技术&#xff0c;…

MySQL数据库--从创建数据库到删库跑路

目录 MySQL安装: 1. 数据库基本操作1.1 创建数据库1.2 显示当前数据库1.3 删除数据库1.4 使用数据库/选中数据库 2. SQL中的数据类型2.1 数值类型2.2 字符串类型2.3 时间类型 3. 表的操作3.2 创建表3.1 显示数据库中的表3.3 查看表的详细情况3.4 删除表3.5 注释3. 修改列(了解即…

数据结构 | 二叉树(基本概念、性质、遍历、C代码实现)

1.树的基本概念 树是一种 非线性 的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#xff0c;称为根…

五分钟“手撕”链表

为了提高大家的学习效率&#xff0c;我把代码放开头&#xff0c;供查阅。 目录 一、链表的实现代码 二、什么是链表 三、链表的分类 四、链表的常见操作 插入 删除 五、Java自带的LinkedList 两个构造方法 一些常用方法 六、LinkedList的遍历 七、ArrayList和Linke…

华媒舍:10种欧洲地区媒体发稿推广技巧

1.了解欧洲地区媒体自然环境必须掌握欧洲地区媒体的发稿推广方法&#xff0c;首先要对欧洲地区媒体自然环境有一定的了解。包含不一样国家的主力媒体&#xff0c;他的阅读者人群、销售市场遮盖及其报导风格等。仅有熟悉媒体自然环境&#xff0c;才能更好的制订营销推广策略。 …

Web----网络通讯部分

一、TCP和UDP的区别 TCP是一种面向连接的协议&#xff0c;它在传输数据之前会建立一条专用的通信连接。这意味着在数据传输过程中&#xff0c;两台计算机之间会有一条稳定的数据传输通道。因此&#xff0c;TCP可以保证数据传输的可靠性&#xff0c;但会带来一定的延迟。 UDP是…

Android VSYNC双Buffer与三Buffer渲染线程RenderThread(5)

Android VSYNC双Buffer与三Buffer渲染线程RenderThread&#xff08;5&#xff09; 手机自带的卡顿丢帧分析工具&#xff0c;柱状图&#xff1a; 帧的大体绘制过程&#xff1a; 帧绘制中的重要概念&#xff1a;BufferQueue 首先看一下 BufferQueue&#xff0c;BufferQueue 是一个…

Visual Studio Code 开发esp8266流程2Arduino 配置 nodemcu

http://arduino.esp8266.com/stable/package_esp8266com_index.json Arduino: Library Manager

第二十五章CSS中的技巧(导航栏、下拉列表)

1.CSS精灵 1.什么是CSS精灵 英文叫法 CSS sprites&#xff0c;通常被解释为“CSS图像拼合”或“CSS贴图定位”;其实就是把网页中一些背景图片整合到一张图片文件中&#xff0c;再利用css“background-image”&#xff0c; “background-repeat”,“background-position”的组…

中国地质大学(武汉):23考研多专业接受调剂,24新增上机考试!中国地质大学(武汉)计算机考研考情分析!

中国地质大学&#xff08;武汉&#xff09;计算机学院成立于1985年&#xff0c;其前身为地矿部武汉计算站。经过近二十年的努力&#xff0c;计算机学院不断发展壮大。现设有计算机应用、计算机软件、网络与系统结构、信息安全四个教研室&#xff1b;拥有湖北省计算机应用技术重…

最大回撤概念与计算

一、最大回撤&#xff0c;是指的最大下跌的值&#xff1a; 1、即所有下跌趋势中&#xff0c;净值最低的点&#xff0c;与历史净值最高点直接的差值。 2、最大回撤取绝对值显示 二、如果有时间限制&#xff0c;则计算对应时间段内的最大回撤。 示意图如下&#xff1a; 三、举…

【Java面试】七、SpringMvc的执行流程、SpringBoot自动装配原理

文章目录 1、SpringMVC的执行流程1.1 视图阶段1.2 前后端分离阶段 2、SpringBoot自动配置原理3、框架常用的注解3.1 Spring的注解3.2 SpringMvc的注解3.3 SpringBoot的注解 4、面试 1、SpringMVC的执行流程 1.1 视图阶段 旧项目中&#xff0c;未前后端分离时&#xff0c;用到…

OAK相机如何将 YOLOv10 模型转换成 blob 格式?

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是Ashely。 专…

Microsoft Fabric 是什么?

最近半个月没有更新内容&#xff0c;原因是什么呢&#xff1f; 原因是花了两周的时间备考了一下"Microsoft Certified: Fabric Analytics Engineer Associate"的考试认证。 非常幸运考试通过了。 那什么是Microsoft Fabric 呢&#xff1f; Microsoft Fabric 是一个…

运筹学_4.整数规划

文章目录 引言4.1 分枝定界方法求解整数规划问题整数规划的分类整数规划解法概述分支定界法 4.2 0-1整数规划0-1整数规划的数学模型隐枚举法求解0-1规划问题 4.3 指派问题(分配问题)的匈牙利解法指派问题的数学模型指派问题的匈牙利解法 引言 规划中的决策变量(全部或部分)限制…

【备战蓝桥杯】蓝桥杯省一笔记:算法模板笔记(Java)

蓝桥杯 0、快读快写模板1、回文判定2、前缀和3、差分4、二分查找5、快速幂6、判断素数7、gcd&lcm8、进制转换9、位运算10、字符串常用API11、n的所有质因子12、n的质因子个数13、n的约数个数14、n阶乘的约数个数15、n的约数和16、阶乘 & 双阶乘17、自定义升序降序18、动…

2024盘古石初赛(服务器部分)

赛后总结 这次初赛就有20道服务器部分赛题&#xff0c;做的情况一般&#xff0c;错了5道题这样&#xff0c;主要原因就是出在第二个网站服务器没有重构起来 今天来复现一下 这次的服务器部分我直接用仿真仿起来就开找了 第一台IM前期配置 先把网配置好&#xff0c;然后ssh…

如此简单,一文带你玩转接口自动化上(Python + Pytest + Requests + Allure )

一. 前言 哈喽大伙们好&#xff0c;好久不见距离上次更新博客已经有一年之久了&#xff0c;这将近一年的时间小编主要的时间都花在了实习和24届校招上面了&#xff0c;最终也是收获满满&#xff0c;选择了一个还不错的offer&#xff0c;感谢一路走来的自己和身边朋友的帮助&…

基于Three.js实现的3D立方体动画

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 基于Three.js实现的3D立方体动画 应用场景 该代码段适用于需要在网页中创建交互式3D场景的场景。例如&#xff0c;可以用于展示产品、创建游戏或制作视觉效果。 基本功能 此代码段使用Three.js库创建了一个…

【机器学习】随机森林:深度解析与应用实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 随机森林&#xff1a;深度解析与应用实践引言1. 随机森林基础1.1 什么是随机森林…