【Leetcode每日一题】 分治 - 数组中的第K个最大元素(难度⭐⭐)(63)

news/2024/9/22 21:58:24/

1. 题目解析

题目链接:数组中的第K个最大元素

这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

2.算法原理

在快速排序算法中,一种常见的优化策略是将数组划分为三个区间。这种划分方式可以更加精确地定位到目标元素所在的位置,从而加快排序速度。具体地,这三个区间为:[l, left]、[left + 1, right - 1] 和 [right, r]。

  1. 区间划分
    • 首先,选定一个基准元素(pivot),通常选择数组的第一个元素或最后一个元素。
    • 然后,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小。
    • 这个分割过程结束后,基准元素所处的位置就是数组的一个划分点,该点将数组分成左右两个子区间。
  2. 计算区间元素个数
    • 在完成划分后,我们计算每个区间的元素个数。这可以通过遍历每个区间并计数来实现。
    • 特别地,对于中间区间 [left + 1, right - 1],它包含了所有与基准元素相等的元素。
  3. 推断目标元素位置
    • 有了每个区间的元素个数,我们就可以推断出目标元素可能位于哪个区间。
    • 如果目标元素小于基准元素,则它必定位于左区间 [l, left] 中;如果目标元素大于基准元素,则它位于右区间 [right, r] 中;如果目标元素等于基准元素,则它可能位于中间区间 [left + 1, right - 1] 中。
  4. 定位并返回结果
    • 根据推断出的目标元素所在区间,我们直接在该区间内进行搜索或返回结果。
    • 如果目标元素存在于中间区间,并且我们关心的是第一个或最后一个等于基准元素的元素,我们可以直接返回该区间的起始或结束位置。

3.代码编写

class Solution 
{
public:int findKthLargest(vector<int>& nums, int k) {srand(time(nullptr));return qsort(nums, 0, nums.size() - 1, k);}int qsort(vector<int>& nums, int l, int r, int k){if(l == r) return nums[l];//1.随机算则一个基准元素int key = getRandom(nums, l, r);//2.将数组分三块int left = l - 1, right = r + 1, i = l;while(i < right){if(nums[i] < key) swap(nums[++left], nums[i++]);else if(nums[i] == key) i++;else swap(nums[--right], nums[i]);}//3.分情况讨论int c = r - right + 1, b = right - left - 1;if(c >= k){return qsort(nums, right, r, k);}else if(b + c >= k){return key;}else{return qsort(nums, l, left, k -b -c);}}int getRandom(vector<int>& nums, int l, int r){return nums[rand() % (r - l + 1) + l];}
};

The Last

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~ 


http://www.ppmy.cn/news/1434097.html

相关文章

如何快速学习盲打键盘的指法

学习盲打键盘的指法需要一定的时间和练习&#xff0c;但是以下几个方法可以帮助你加快学习的速度&#xff1a; 掌握正确的手位&#xff1a;了解标准的键盘布局以及手指应该放置的位置是学习盲打的第一步。在QWERTY键盘上&#xff0c;你的左手应该放在ASDF键上&#xff0c;右手应…

修改键盘映射(改易误触按键)

原文&#xff1a;https://blog.iyatt.com/?p14730 测试环境 Windows 11 专业版 23H2 Beta 预览版 操作 步骤 打开注册表 地址栏复制粘粘回车进入路径&#xff1a;计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout 右侧空白处右键新建二进制…

虚拟化及Docker基础

一、虚拟化 1.1 云端 1.2 云计算服务模式分层 1.3 虚拟化架构 1.3.1 寄居架构 1.3.2 原生架构 1.4 虚拟化产品 1.4.1 仿真虚拟化产品&#xff08;对系统硬件没有要求&#xff0c;性能最低&#xff09; 1.4.2 半虚拟化 &#xff08;虚拟机可以使用真机物理机&#xff09…

Linux-System V信号量

目录 System V信号量创建或打开信号量操作信号量信号量撤销值控制信号量IPC_RMIDIPC_STATIPC_SETGETVALSETVALGETPIDGETNCNTGETZCNT 代码示例 System V信号量 信号量的作用和消息队列不太一样&#xff0c;消息队列的作用是进程之间传递消息。而信号量的作用是为了同步多个进程…

【Qt】.ui文件转.h文件

1、打开qt命令行 2、转换 uic -o ui.h mainwindow.ui

顺序栈算法库构建

学习贺利坚老师,顺序栈,构建顺序栈算法库 数据结构之自建算法库——顺序栈_设计一个主函数实现对顺序栈进行操作测试&#xff0c;测试方法&#xff0c;依次把元素-CSDN博客文章浏览阅读4.9k次&#xff0c;点赞10次&#xff0c;收藏10次。本文针对数据结构基础系列网络课程(2)&…

Parallels Desktop 19完美中文版 PD19虚拟机详细图文安装教程 亲测兼容M1/M2

对于许多Mac用户来说&#xff0c;运行Windows应用程序是必不可少的。也许你的雇主使用的软件只适用于Windows&#xff0c;或者需要使用依赖于某些Windows技术的网站。或者你想在Mac上玩Windows游戏。或者&#xff0c;你可能需要在其他操作系统上测试应用程序和服务——你可以在…

idea的macOS Apple Silicon (dmg)版本和macOS (dmg)版本有什么区别

“macOS Apple Silicon (dmg)” 版本则是专门为使用 Apple Silicon 芯片的 Mac 设备而设计的版本。 区别通常在于目标硬件平台和优化程度&#xff1a; 目标硬件平台&#xff1a;macOS Apple Silicon 版本是专门为基于 Apple Silicon 芯片的 Mac 设备&#xff08;例如 M1、M1 P…