剑指Offer专项突破版(76)—— 数组中的第 k 大的数字

news/2024/4/27 12:17:56/文章来源:https://blog.csdn.net/qq_39383767/article/details/128108993

题目

剑指 Offer II 076. 数组中的第 k 大的数字
在这里插入图片描述

思路

假设有个划分函数divide:

  • divide:将num在[l,r]范围内,按照nums[l]进行划分,返回一个数组range,划分为:

    • 所有小于nums[l]的数:移动到nums[l,range[0]-1]
    • 所有等于nums[l]的数:移动到nums[range[0],range[1]]
    • 所有大于nums[l]的数:移动到nums[range[1+1],r]

我们要找第k大的数,可以转化为求第nums.length - k + 1小的数

对nums在[0,nums.length-1]范围内做划分,结果为range:

  • 如果k就在range的范围内,即 k >= range[0] && k <= range[1],说明第k小的数就是nums[range[0]]
  • 如果k < range[0],说明第k小的数在前半段,即nums[0,range[0]-1]中,那就在这个范围内去递归处理
  • 如果k > range[0],说明第k小的数在后半段,即nums[range[1]+1,]中,那就在这个范围内去递归处理

最后看看divide怎么实现:

由于最终需要将数组nums在[l,r]范围内划分为4个区域,因此需要定义这3个区域的边界:

  • 小于nums[l]的区域[l+1,less]

    • 一开始所有区域的范围都是0,因此less初始化为l
  • 等于nums[l]的区域[less+1,i-1]

    • 等于区域一定紧跟着小于区域,因此左边界为less+1
    • 其右端点为当前遍历的位置的前一个位置,也就是i-1
    • i会初始化为l+1,因此等于区域的初始范围也是0个元素
  • 大于nums[l]的区域[more,r]

    • 因为需要初始化为0个元素,因此more初始化为r+1
  • 最后还剩下一个未定区域:[i,more-1]

接着从l+1开始遍历每个元素i,如果

  • nums[ i ]等于nums[l] :什么都不用处理,i++
  • nums[ i ]小于nums[l] :将nums[i]和等于区域的第一个数交换,将小于区域的右边界less++

    • 实质是扩充小于区域
    • 交换过来的数等于nums[l],因此i++,继续后面的循环
    • 这样操作后,整个数组依旧维持4个区域的定义
  • nums[ i ]大于于nums[l] :将nums[i]和大于区域的前一个数交换,将大于区域的左边界–

    • 实质是扩充大于区域
    • 此时由于不清楚交换过来的数和nums[l]的关系,因此需要重新进入循环
    • 这样操作后,整个数组依旧维持4个区域的定义

在这里插入图片描述

什么时候结束循环呢?

当i和more相撞的时候,表示数组中所有的数都遍历过了,且都在正确的位置上

代码

class Solution {public int findKthLargest(int[] nums, int k) {k = nums.length - k + 1 -1 ;int l = 0;int r = nums.length-1;while(true) {int[] range = divide(nums,l,r);if(k >= range[0] && k <= range[1]) {return nums[k];}if(k < range[0]) {r = range[0]-1;} else {l = range[1] + 1;}}}private int[] divide(int[] nums,int l,int r) {if(l == r) {return new int[]{l,l};}int p = nums[l];// 大于[more,r]int more = r + 1;// 小于[l+1,less]// 等于[less+1,i-1]int less = l;int i = l + 1;for(;i<more;){if(nums[i] < p){swap(nums,i,less+1);i++;less++;} else if(nums[i] > p) {swap(nums,i,more-1);more--;} else {i++;}}// 等于区域 [less+1,i-1]swap(nums,l,less);return new int[]{less,i-1};}private void swap(int[] nums,int a,int b) {int temp = nums[a];nums[a] = nums[b];nums[b] = temp;}
}

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

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

相关文章

[NCTF2019]SQLi

进来就有个弹窗 甚至给了sql语句 sqlquery : select * from users where username and passwd 先扫一下目录&#xff0c;发现有个robots.txt 提示有个hint.txt $black_list "/limit|by|substr|mid|,|admin|benchmark|like|or|char|union|substring|select|greatest|%00…

Kotlin高仿微信-第18篇-单聊-删除单条信息

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

Qt编写视频监控系统67-录像计划(支持64通道7*24录像设置)

一、前言 录像计划这个功能一直挂了很久&#xff0c;之前做的也都有保存视频文件功能&#xff0c;其中还分了三大种&#xff0c;第一种是手动开启和停止录像&#xff1b;第二种是按照指定时长比如10s保存文件&#xff1b;第三种是定时30分钟一个文件一直保存。这三种功能直接写…

opengl,opengl es,egl,glfw,glew

OpenGL ES之GLFW窗口搭建 - Plato - 博客园概述 本章节主要总结如何使用GLFW来创建Opengl窗口。主要包括如下内容&#xff1a; OpenGl窗口创建介绍 GLFW Window版编译介绍 GLFW简单工程源码介绍 OpenGL窗口创建介绍 能用于Ohttps://www.cnblogs.com/feng-sc/p/5093262.htmlOp…

2022-11-30 Github Forking 工作流模式

Forking 工作流 fork 操作是在个人远程仓库新建一份目标远程仓库的副本&#xff0c;流程如下&#xff1a; 比如在 GitHub 上操作时&#xff0c;在项目的主页点击 fork 按钮&#xff08;页面右上角&#xff09;&#xff0c;即可拷贝该目标远程仓库。 假设开发者 A 拥有一个远程仓…

电脑怎么提取图片中的文字?

图片记录着我们生活的点点滴滴&#xff0c;比如各种办公截图、查快递单号、布置的课堂作业等等&#xff0c;都离不开这种便捷的方法。而我们有时难免需要从图片中提取想要的文字&#xff0c;总不能就靠打字打到手软吧&#xff0c;那么电脑怎么提取图片中的文字呢?有需要的朋友…

终于有阿里p8进行了大汇总(Redis+JVM+MySQL+Spring)还有面试题解全在这里了!

Redis特性 Redis是一直基于键值对的NoSQL数据库&#xff1b; Redis支持5种主要数据结构&#xff1a;string、hash、list、set、zset以及bitmaps、hyperLoglog、GEO等特化的数据结构&#xff1b; Redis是内存数据库&#xff0c;因此它有足够好的读写性能&#xff1b; Redis支持…

verilog实现分频(奇数分频和偶数分频,通用版)

大家好&#xff0c;最近写了一些分频器的设计&#xff0c;发现奇数分频和偶数分频是比较常用分频效果&#xff0c;所以写了一个比较简单的分频代码&#xff0c;适用于奇数分频和偶数分频&#xff08;不考虑占空比&#xff09;&#xff0c;代码已经经过测试&#xff0c;需要可自…

如何应对Redis并发访问带来的问题

前言 我们在使用Redis的过程中&#xff0c;难免会遇到并发访问及数据更新的问题。但很多场景对数据的并发修改是很敏感的&#xff0c;比如库存数据如果没有做好并发读取和更新的版本控制&#xff0c;就会导致严重的业务问题。今天就来说说应该如何做好并发访问及数据更新问题。…

ROS2--概述

ROS2概述1 ROS2对比ROS12 ROS2 通信3 核心概念4 ros2 安装5 话题、服务、动作6 参数参考1 ROS2对比ROS1 多机器人系统&#xff1a;未来机器人一定不会是独立的个体&#xff0c;机器人和机器人之间也需要通信和协作&#xff0c;ROS2为多机器人系统的应用提供了标准方法和通信机…

Windows系统--AD域控--DHCP服务器

Windows系统--AD域控--DHCP服务器 虚拟机网络准备 1.将VMware网络编辑器的NAT模式--取消勾选 使用本地DHCP服务器; 从机(win10)将内置网卡的IPv4网络改为 自动获取IP地址、自动获取DNS AD服务器 部署 DHCP服务器

VF01销售开票发票金额控制增强

实施隐式增强 全部代码如下&#xff1a; method IF_EX_BADI_SD_BILLING~INVOICE_DOCUMENT_CHECK. CALL FUNCTION ‘SIPT_DOC_CHECK_SD’ EXPORTING it_xvbrk fxvbrk it_xvbrp fxvbrp it_xkomv fxkomv it_xvbpa fxvbpa IMPORTING ev_bad_data fbad_data. “”“”“”“…

Word控件Spire.Doc 【图像形状】教程(8): 如何借助C#/VB.NET在 Word 中插入艺术字

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

Kotlin高仿微信-第12篇-单聊-图片

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

【JavaEE】MyBatis

文章目录1.MyBatis介绍2.MyBatis快速入门3.Mapper代理开发4.MyBatis核心配置文件5.配置文件完成增删改查5.1 查询5.2 添加/修改5.3 删除6.MyBatis参数传递7.注解完成增删改查1.MyBatis介绍 1.什么是MyBatis? MyBatis是一款优秀的 持久层框架&#xff0c;用于简化JDBC开发MyBat…

入门力扣自学笔记208 C++ (题目编号:895)

895. 最大频率栈​​​​​​ 题目&#xff1a; 设计一个类似堆栈的数据结构&#xff0c;将元素推入堆栈&#xff0c;并从堆栈中弹出出现频率最高的元素。 实现 FreqStack 类: FreqStack() 构造一个空的堆栈。 void push(int val) 将一个整数 val 压入栈顶。 int pop() 删除…

Kotlin高仿微信-第11篇-单聊-语音

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

基于Tree-LSTM网络语义表示模型

TC&#xff1b;DR 目前的LSTM仅能对序列信息进行建模&#xff0c; 但是自然语言中通常由词组成的短语形成了句法依存的语义树。为了学习到树结构的语义信息。论文中提出了两种Tree-LSTM模型。Child-Sum、Tree-LSTM、和N-ary Tree LSTMs。实验部分的Tree-LSTM、对比多种LSTMs的…

nuxtjs中asyncData异步数据请求、代理配置、fetch网络请求、vuex的使用、中间件处理

文章目录1. asyncData异步数据请求2. 代理配置3. fetch网络请求4. vuex4.1 state中的数据展示4.2 同步方法与异步方法4.3 数据持久化处理5. 中间件处理1. asyncData异步数据请求 Nuxt.js 扩展了 Vue.js&#xff0c;增加了一个叫 asyncData 和 fetch 的方法&#xff0c;使得我们…

这或许是全网最详细的介绍预言机赛道的视频课程,通俗易通,有趣有料!

图片来源&#xff1a;由无界版图 AI 绘画工具生成有一句话在创业者中很流行&#xff1a;Web3创业三大坑&#xff0c;隐私、跨链、预言机……搞塌加密市场的DK和SBF还在豪华度假酒店里思考人生搞隐私&#xff0c;一毛钱没赚到的Tornado cash开发者却在吃牢饭……加密圈前十大资产…