NC88 寻找第K大

Python实现查找数组中任意第k大的数字算法示例 主要介绍了Python实现查找数组中任意第k大的数字算法,涉及Python针对数组的排序、查找等相关操作技巧,需要的朋友可以参考下 立即下载

描述
有一个整数数组,请你根据快速排序的思路,找出数组中第 k 大的数。

给定一个整数数组 a ,同时给定它的大小n和要找的 k ,请返回第 k 大的数(包括重复的元素,不用去重),保证答案存在。
要求:时间复杂度 O(nlogn)O(nlogn),空间复杂度 O(1)O(1)
数据范围:0 <=n <= 1000, 0<K<n, 数组中每个元素满足 0<=val<=10000000。

示例1:
输入:[1,3,5,2,2],5,3
返回值:2
示例2
输入:[10,10,9,9,8,7,5,6,4,3,4,2],12,3
返回值:9
说明:去重后的第3大是8,但本题要求包含重复的元素,不用去重,所以输出9。

思想:
利用快排将数组先排序,排序之后,将第K大的取出即可。
快排的思想:
先从数列中取出一个数作为基准数(通常取第一个数)。
分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
再对左右区间重复第二步,直到各区间只有一个数。
快排的时间复杂度:O(nlogn)
需要注意的地方:
1)快排实质上是一个分治的思想,所以需要用到递归,递归的出口是left和right一致时,不需要再次排序,直接返回数组即可。
2)快排为了找到当前基准数的正确位置,需要用到两个游标 i 和 j,分别从两边开始找比基准值大和小的值,这里需要注意,如果选择的基准是最左测,这时需要先动j,即选从最右边选择到比基准值小的,因为选动的那个确定了截止范围,因为后面需要找到 i 和 j 相遇位置和基准数换,这个位置所在的数一定是要比基准数小的,因为基准数在最左测;同样的,要是选择最右侧的值作为基准值就要选择左边的i先动。
主要代码如下:

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param a int整型一维数组 
# @param n int整型 
# @param K int整型 
# @return int整型
#
class Solution:
    def findKth(self , a: List[int], n: int, K: int) -> int:
        self.kp(a, 0, n-1)  # 将数组a进行快排
        return a[n-K]       # 返回第K大的数
    
    
    def kp(self, a: List[int], left : int, right: int):
        # 将数据快排后返回
        if left >= right:  # 递归出口
            return 
        else:
            p = a[left]   # 取最左测为基准值
            i = left      # 设置两个游标
            j = right
            while(i != j):   # 直到相遇
                while(a[j] >= p and i < j):  # i < j 保证不会过头 要是过头的话后面都是比基准值大的数 循环不会停止了
                    j= j - 1;
                while(a[i] <= p and i < j):
                    i= i + 1;
                temp = a[i]                 # 在相遇之前,遇到右侧小的和左侧大的进行数值的交换
                a[i] = a[j]
                a[j] = temp
            a[left] = a[i]                  # 两个游标相遇,相遇的位置就是基准值应该在的位置,进行交换
            a[i] = p
            self.kp(a, left, i-1)           # 从基准值处分成两段,递归进行排序
            self.kp(a, i+1, right)

扩展: 当K很小的时候,可使用冒泡排序,因为冒泡排序的思想每一次就是确定好一个位置。这时相对的时间复杂度会小,为O(n * k)。
冒泡排序的思想: 冒泡排序属于一种典型的交换排序。
  交换排序顾名思义就是通过元素的两两比较,判断是否符合要求,如过不符合就交换位置来达到排序的目的。冒泡排序名字的由来就是因为在交换过程中,类似水冒泡,小(大)的元素经过不断的交换由水底慢慢的浮到水的顶端。
  冒泡排序的思想就是利用的比较交换,利用循环将第 i 小或者大的元素归位,归位操作利用的是对 n 个元素中相邻的两个进行比较,如果顺序正确就不交换,如果顺序错误就进行位置的交换。通过重复的循环访问数组,直到没有可以交换的元素,那么整个排序就已经完成。

所以,只需要进行K此冒泡,就把最大的交换到它应该在的位置。

class Solution:
    def findKth(self , a: List[int], n: int, K: int) -> int:
        for i in range(K):     # 注意这两个循环设置的范围
            for j in range(n-1):    
                if a[j] > a[j+1]:
                    temp = a[j+1]
                    a[j+1] = a[j]
                    a[j] = temp
        return a[n - K]

补充一个进阶的思路过程,如果感兴趣可以都实现一下:
https://mp.weixin.qq.com/s/FFsvWXiaZK96PtUg-mmtEw
链接

嵌入式C开发必备:用Cursor规则搞定代码风格检查(附Pikachu项目实战) 本文以Pikachu开源项目为例,详细介绍了如何利用Cursor的AI代理规则系统,为嵌入式C开发项目配置一套完整的代码风格检查与规范执行方案。通过实战演示,指导开发者创建项目级规则,实现命名、格式、硬件抽象层及驱动开发的自动化规范,从而提升代码一致性、可维护性和团队协作效率。 阅读详情

相关推荐

工作笔记05:imu、底盘车轮、单激光雷达外参校准(基于hdl_graph_slam建图和定位)

目录1. imu 校准1.1 IMU型号1.2 坐标定义1.2.1 大地坐标系(WGS84)1.2.2 当地地理坐标系(ENU)1.2.3 传感器坐标轴定义1.3 传感器校准2. 底盘车辆参数配置3. 单激光雷达校准参考文献 1. imu 校准 1.1 IMU型号 阅读IMU产品说明书,获得如下信息: Yesense YIS300 系列惯性传感系统 YIS300 系列包含: YIS300-U 惯性测量单元(IMU):输出经过校准的加速度和角速度值,同时也能够输出磁场强度信息。 YIS300-V 垂直参考系

穿林需独行的博客 4203

网易2016笔试(3)

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。 测试样例:[1,3,5,2,2],5,3 返回:2       我的第一个思路,使用快排进行排序,排序后就可以得到第k个最大的数了。        int quicksort(vector&a,int i,int

yutianxin123的专栏 1223

高效低功耗设计:PMOS电子开关在墨水屏与ADC采样电路中的创新应用

本文深入探讨了PMOS电子开关在低功耗设计中的创新应用,特别是在墨水屏和ADC采样电路中的关键作用。通过详细分析PMOS的导通机制和近乎零静态功耗特性,展示了其在待机低功耗场景下的显著优势,并提供了实用的电路设计技巧和元器件选型建议,帮助工程师实现极致的功耗优化。

weixin_29193359的博客 162

寻找数组中第k大的数

题目:有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。 测试样例: [1,3,5,2,2],5,3 返回: 2 方法一: 利用冒泡排序,进行k趟排序,即可查找到第k大的数(每趟冒泡排序都寻找当前序列中的最大值) 方法二: 利用选择排序,进行k趟排序,即可查找到第k大的数(每趟选择排序都寻找当前序列中的最大值) 方法三: 利用快速排序的思想,只需找到第k大的数,不必把所.

m0_37671741的博客 7921

DELPHI11 利用Android手机实现条码扫描功能

好了,整个过程全部结束,当然这只是最简单的例子,只是演示一下如何识别条码,更多的条码处理功能,比如优化,提速等需要在后面继续。安装过程中所有提示框全部按OK就可以,直到提示安装成功,那么ZXing库就成功完成了安装。点击红框标识的文件夹图标,将下载的ZXing库文件路径加入进来后,点ADD。第三步:选择下载的ZXing库路径,并按Ctrl + A进行全选,并导入。至此为止,我们的库才算是全部安装完成,可以在DELPHI 中正常引用了。2.打开相机,识别条码,并将条码内容显示在MEMO1中。

1530

iOS 取证窍门:为什么要先从 Recovery 恢复模式开始?

未记录的 DFU 代表“设备固件升级”。与专为普通用户设计的恢复模式不同,DFU 模式从来都不是为公众设计的。Apple 知识库中的任何地方都没有关于 DFU 的文档。进入 DFU 的方法主要是通过按下、按住和释放按钮的复杂操作序列,并具有精确的时间限制。在多个步骤中的任何一个步骤中,如果时间错误,都会导致重新启动设备,而不是将其切换到 DFU。另外,设备屏幕上也没有 DFU 模式的指示。如果设备成功切换到 DFU,显示屏将保持黑色。即使对于专家来说,进入 DFU 模式也可能很困难。恢复模式是最容易解释的。

2302_82041293的博客 1198

牛客网题目--寻找第K大数字,百度研发面试题目(python实现)

题目描述: 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。 测试样例: [1,3,5,2,2],5,3 返回:2 补充说明:由于本人还没有开始学习所有数据结构的相关内容,因此都是用比较基础的知识去实现,等我这学期结束之后,将会对相关题目用相关的算法加以实现。 思路分析:我们只需要对数组进行排序,然后根据列表的一些基础知识便可实现。 class Finder: def findKth

kingJamesbond的博客 465

C# 调用高德地图关键词 API

今天我们要一起探索如何使用 C# 来调用高德地图的关键词搜索 API,从而实现精准的地理位置搜索功能。高德地图的关键词搜索 API 可以帮助我们轻松地实现这一点,它能够返回一系列匹配关键词的地点坐标和其他相关信息。通过简单的几行 C# 代码,我们就实现了调用高德地图关键词搜索 API 的功能。接下来,我们将在一个 C# 控制台应用中实现调用高德地图关键词搜索 API 的功能。此外,如果要在生产环境中使用,还需要考虑安全性问题,例如不要在客户端暴露 API 密钥。🔥关注墨瑾轩,带你探索编程的奥秘!

java专栏 1105

leetcode-寻找第K大-快速排序(堆排序)

一、题目 题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。 示例1 输入 [1,3,5,2,2],5,3 返回值 2 二、思路 1、快速排序的思路 2、在快排的基础上加上终止条件,判断一次排完后k的值与两个指针相遇那个点的大小,如果k大,则说明那个点的左右两边都需要再排序;如果相等直接返回数组索引的那个值;如果k小,则说明只需要对右边部分排序;如果这样都没有找到一个相等的,则整个

weixin_45794299的博客 540

2 君正底层API接口的封装1

君正的IPC芯片主要有T31、T40、T41等型号,每个型号的API接口大部分是相同的,但也存在一些不一致和差异化的地方。为了屏蔽不同芯片型号之间的差异,我们需要基于一个公共基类进行封装。在封装之前,我们需要定义自己的错误码和数据结构,用于屏蔽不同君正芯片的实现细节。为了确保整个IPC库使用统一的错误码,我们在HP_MPPErrorCode.h文件中专门定义了以下错误码。错误码囊括了参数错误、内存错误、溢出错误、不支持、密码错误、非法数据等各种异常情况。

hope_wisdom的技术博客 1587

Arduino I2C for TCA9548A应答扫描程序

Arduino I2C for TCA9548A应答扫描程序

perseverance51博客 1119

牛客网刷题:寻找第K大

题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第 k 大的数。 给定一个整数数组 a ,同时给定它的大小n和要找的 k ,请返回第 k 大的数(包括重复的元素,不用去重),保证答案存在。 要求:时间复杂度 O(nlogn)O(nlogn)O(nlogn)O(nlogn)O(nlogn)O(nlogn),空间复杂度 O(1)O(1)O(1)O(1)O(1)O(1) 数据范围:0≤n≤10000≤n≤10000\le n \le 10000≤n≤10000≤n≤10000≤n≤1000, 1≤K≤

胡图图的博客 544

UltraScale系列底层结构(3)——URAM概述

在UltraScale+™ 器件中,除了我们在常规熟悉的BRAM资源以外,还额外提供了URAM(UltraRAM)资源。 UltraRAM 是一种单时钟同步操作的高密度存储器,每个 UltraRAM 块可存储 288 Kb 数据,配置为 4K x 72 位的存储单元,其容量是 Block RAM 的八倍。虽然 UltraRAM 内部使用单端口存储单元,但通过在一个时钟周期内顺序执行端口 A 和端口 B 的操作,实现了双端口功能。

apple_53311083的博客 2833

NC88寻找第K大的数

题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。 测试样例: [1,3,5,2,2],5,3 返回:2 题解: 利用快速排序的方法,找准第一个数的最终位置,下标为index。如果它的右侧数量正好是k-1个,那么它就是第k大的数,因为比它大的数最终都会在它的右边;如果右侧比k-1小,则要找的数在左边,递归求解左边第k-(右侧个数+1) package com.

ahcdwx的博客 234

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

NC88—寻找第K大

题意 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。 题解 class Finder { public: int findKth(vector<int> a, int n, int K) { return recur(a, 0, n-1, K); } int recur(vector<int>& a, int

fkuner的博客 1000

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

牛客NC.88寻找第K大

寻找第K大 题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。 思路: 在快速排序的基础上,判断当前把数组分为两半的“支点”的下标是不是K-1。 若是,直接返回。 若支点下标大于k-1,在支点左边用快排的方法看下层支点的下标是不是K-1。 若支点下标小于k-1,在支点右边用快排的方法看下层支点的下标是不是K-1。 import java.util.*; public class

31楼下小黑的博客 239

寻找第K大——NC.88

题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。 [1,3,5,2,2],5,3 2 题解 快速排序写出来即可 import java.util.*; public class Solution { public int findKth(int[] a, int n, int K) { // write code here Qui

学而不思则忘 570

Leetcode寻找第K大 NC88

题目描述: 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。 测试样例: [1,3,5,2,2],5,3 返回:2 思路:先根据快排算法排序整个数组,然后直接输出第K个大的数,这里我采用了递归的的方法实现快排。 代码如下:(有更好算法的可以教一下,谢谢) `在这里插入代码片 `/** * * @param a int整型一维数组 * @param aLen int a数组长度 *

ZY1732331520的博客 304
上一篇: NC105 二分查找进阶
下一篇: LeetCode24:两两交换链表中的结点
coding_diamond
博客等级 码龄8年 8粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值