当前位置: 首页 > news >正文

【力扣二刷思路】DAY3

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

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

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

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

思路

  1. findKthLargest 函数:公共接口函数,接收一个整数数组 nums 和一个整数 k 作为参数,返回第 k 大的元素。在该函数中,直接调用了私有成员函数 qucikSelect,并将结果返回。

  2. qucikSelect 函数:递归接收一个整数数组 nums 和一个整数 k 作为参数,返回数组中第 k 大的元素。该函数的实现采用了快速选择算法的思想。

    • 在每次调用中,随机选择数组中的一个元素 p 作为 pivot(中轴)。
    • 然后将数组 nums 中小于、等于和大于 pivot 的元素分别放入三个数组 small、equal 和 big 中。
    • 如果 k 小于等于 big 的大小,则在 big 数组中继续递归查找第 k 大的元素。
    • 如果 k 大于 big 的大小但小于等于 nums 减去 small 的大小,说明第 k 大的元素位于 equal 中,直接返回 pivot。
    • 如果 k 大于 nums 减去 small 的大小,则在 small 数组中继续递归查找第 k 减去 small 大小的元素。
  3. 递归结束条件:递归结束条件是当数组大小等于 1 时,直接返回数组中唯一的元素。

  4. 时间复杂度:平均时间复杂度为 O(n),最坏情况下为 O(n^2),其中 n 为数组的大小。这是因为快速选择算法的平均情况下每次能够将搜索范围缩小为原来的一半,但最坏情况下可能需要遍历整个数组。

  5. 空间复杂度:除了递归调用栈外,额外使用了三个辅助数组,因此空间复杂度为 O(n)。

题解

class Solution {
public:// 主函数,找出无序数组中第 k 大的元素int findKthLargest(vector<int>& nums, int k) {// 调用快速选择算法并返回结果return quickSelect(nums, k);}private:// 快速选择算法int quickSelect(vector<int>& nums, int k) {// 随机选择一个元素作为 pivot(中轴)int pivot = nums[rand() % nums.size()];// 定义三个辅助数组,分别存放小于、等于和大于 pivot 的元素vector<int> smaller, equal, bigger;// 遍历数组,将元素根据大小放入不同的辅助数组中for (int num : nums) {if (num < pivot)smaller.push_back(num);else if (num == pivot)equal.push_back(num);elsebigger.push_back(num);}// 如果 k 小于等于大于 pivot 的元素数量,则在 bigger 数组中继续查找第 k 大的元素if (k <= bigger.size())return quickSelect(bigger, k);// 如果 k 大于 bigger 的大小但小于等于 nums 减去 smaller 的大小,则返回 pivotif (k <= bigger.size() + equal.size())return pivot;// 否则,在 smaller 数组中继续查找第 k - (bigger.size() + equal.size()) 大的元素return quickSelect(smaller, k - bigger.size() - equal.size());}
};

相关文章:

  • SpringSecurity(SpringBoot2.X版本实现)
  • Java面试题总结16之分布式id生成方案
  • Android Kotlin知识汇总(一)编程语言
  • StarRocks面试题及答案整理,最新面试题
  • 利用适配器模式使用第三方库
  • mybatis源码阅读系列(二)
  • 【SpringCloud微服务实战08】RabbitMQ 消息队列
  • Lua中文语言编程源码-第五节,更改lcorolib.c协程库函数, 使Lua加载中文库关键词(与所有的基础库相关)
  • 突破编程_C++_C++11新特性(nullptr、constexpr与基于范围的 for 循环)
  • 数字孪生与智慧城市:实现城市治理现代化的新路径
  • ES6(二):解构赋值、Symbol、Map和Set、数组的扩展方法
  • 【漏洞复现】大华智慧园区综合管理平台deleteftp命令执行漏洞
  • 从零开始的LeetCode刷题日记:替换数字
  • 小白必看的Python基础之函数篇
  • 如果网络不好 如何下载huggingface上的模型
  • hexo+github搭建个人博客
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • input的行数自动增减
  • JavaScript设计模式系列一:工厂模式
  • Java精华积累:初学者都应该搞懂的问题
  • js算法-归并排序(merge_sort)
  • Linux下的乱码问题
  • nodejs调试方法
  • Object.assign方法不能实现深复制
  • Promise面试题2实现异步串行执行
  • Travix是如何部署应用程序到Kubernetes上的
  • 编写高质量JavaScript代码之并发
  • 机器学习学习笔记一
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 前端_面试
  • 突破自己的技术思维
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 正则学习笔记
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • #每日一题合集#牛客JZ23-JZ33
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (a /b)*c的值
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (接口封装)
  • (转)人的集合论——移山之道
  • ***监测系统的构建(chkrootkit )
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • *Django中的Ajax 纯js的书写样式1
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET MVC第三章、三种传值方式
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .net网站发布-允许更新此预编译站点
  • [ linux ] linux 命令英文全称及解释
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯