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

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

目录

一、问题描述

二、解题思路

整体思路

具体思路

三、代码实现


一、问题描述

二、解题思路

整体思路

可以采用区间划分的快速选择排序算法来解决这个问题。本题的思路与leetcode 912 排序数组-CSDN博客的思路一致。

具体思路

(1)采用三指针区间划分的方法将区间划分成三个部分:

<1>区间[l,left],区间内的所有数字均小于key;

<2>区间[left+1,right-1],区间内的所有数字均为key,区间中元素的个数b=right-left-1;

<3>区间[right,r],区间内所有数字均大于key,区间中元素的个数a=r-right+1;

区间划分为三部分可参考:leetcode 75 颜色分类-CSDN博客

(2)因为要返回第K大的数字,所以有以下三种情况:

<1>如果a>=k,说明第K大的数落在[right,r]这个区间里面,返回qsort(nums,right,r,k)即可;

<2>如果a+b>=k,说明第K大的数落在[left+1,right-1]这个区间里面,区间的所有元素均为key,直接返回K即可;

<3>如果第K大的数落在[l,left]这个区间里面,返回qsort(nums,l,left,k-a-b)即可;

三、代码实现

时间复杂度:T(n)=O(n)

空间复杂度:S(n)=O(1)

class Solution {
public:int findKthLargest(vector<int>& nums, int k) {//产生随机数种子srand(time(NULL));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];//随机选择基准元素int key=GetRandom(nums,l,r);//根据基准元素分三块int left=l-1,right=r+1,i=l;while(i<right){if(nums[i]==key) i++;else if(nums[i]<key) swap(nums[++left],nums[i++]);else swap(nums[--right],nums[i]);}//[l,left],[left+1,right-1],[right,r]三个区间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 left,int right){int r=rand();return nums[left+r%(right-left+1)];}
};

http://www.xdnf.cn/news/1479295.html

相关文章:

  • Jupyter Notebook与cpolar:构建跨地域数据科学协作平台
  • 正态分布 - 计算 Z-Score 的 无偏估计
  • 计算机主板上的那颗纽扣电池的作用是什么?
  • OSG中TerrainManipulator(地形适配操纵器)
  • STM32CubeProgrammer软件安装
  • Qt 中的 Q_OBJECT 宏详解 —— 从源码到底层机制的全面剖析
  • 2023年ASOC SCI2区TOP,改进元启发式算法+考虑医护人员技能水平的家庭健康护理路径规划,深度解析+性能实测
  • 【Redis】缓存的穿透、击穿和雪崩
  • 一个正常的 CSDN 博客账号,需要做哪些基础准备?
  • C++基础知识
  • 《sklearn机器学习——聚类性能指标》Silhouette 系数
  • 用 Hashcat 提取哈希值并找回遗忘的密码:一次实用的尝试
  • 【Big Data】Apache Kafka 分布式流处理平台的实时处理实践与洞察
  • uniapp基础组件概述
  • SPI 三剑客:Java、Spring、Dubbo SPI 深度解析与实践​
  • 【开题答辩全过程】以电商数据可视化系统为例,包含答辩的问题和答案
  • 编辑shell脚本示例练习
  • 《sklearn机器学习——聚类性能指标》Davies-Bouldin Index (戴维斯-博尔丁指数)
  • Linux 96 shell:expect { }
  • 车载通信架构 --- DoIP企业规范中细节有哪些?
  • Huawei C 安全函数库
  • LabVIEW无线预警喷淋系统
  • 问题:指令译码前控制信号还没有产生,那么如何控制译码前指令的动作呢?
  • NV308NV309美光固态闪存NW388NW504
  • Docker部署搜索引擎SearXNG
  • (算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
  • 《云原生故障诊疗指南:从假活到配置漂移的根治方案》
  • Spark 中spark.implicits._ 中的 toDF和DataFrame 类本身的 toDF 方法
  • 【51单片机】【protues仿真】基于51单片机PM2.5空气质量检测系统
  • 云手机在企业办公中的作用