Python面试宝典第30题:找出第K大元素

news2024/11/13 15:13:38

题目

        给定一个整数数组nums,请找出数组中第K大的数,保证答案存在。其中,1 <= K <= nums数组长度。

        示例 1:

输入:nums = [3, 2, 1, 5, 6, 4], K = 2
输出:5

        示例 2:

输入:nums = [50, 23, 66, 18, 72], K = 3
输出:50

快速选择算法

        快速选择算法的基本思想是:通过一次划分操作,将数组分为两部分,使得一部分的所有元素都小于另一部分的所有元素;如果K正好位于划分点,则我们找到了答案;否则,我们只需要在较小的那一部分中继续寻找。使用快速选择算法求解本题的主要步骤如下。

        1、选取一个基准元素pivot。

        2、对数组进行划分,使得所有小于pivot的元素都在其左侧,所有大于pivot的元素都在其右侧。

        3、根据pivot的位置,决定下一步的操作。

        (1)如果pivot的位置正好是K-1,那么pivot就是我们要找的第K大的元素。

        (2)如果pivot的位置大于K-1,那么我们需要在左侧子数组中继续查找。

        (3)如果pivot的位置小于K-1,那么我们需要在右侧子数组中继续查找。

        4、重复上述步骤,直到找到最终答案。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def partition(nums, left, right):
    # 选择最右边的元素作为基准
    pivot = nums[right]
    i = left
    for j in range(left, right):
        if nums[j] < pivot:
            nums[i], nums[j] = nums[j], nums[i]
            i += 1
    nums[i], nums[right] = nums[right], nums[i]
    return i

def quickselect(nums, left, right, k):
    if left == right:
        return nums[left]

    pivot_index = partition(nums, left, right)
    # 判断基准的位置
    if k == pivot_index + 1:
        return nums[k - 1]
    elif k < pivot_index + 1:
        return quickselect(nums, left, pivot_index - 1, k)
    else:
        return quickselect(nums, pivot_index + 1, right, k)
  
def find_Kth_largest_element_by_quick_select(nums, k):
    # 因为数组索引从0开始,而题目要求的是第k大的数,所以需要转换为第n-k+1小的数  
    n = len(nums)
    return quickselect(nums, 0, n - 1, n - k + 1)
  
nums = [3, 2, 1, 5, 6, 4]
k = 2
print(find_Kth_largest_element_by_quick_select(nums, k))

nums = [50, 23, 66, 18, 72]
k = 3
print(find_Kth_largest_element_by_quick_select(nums, k))

堆排序法

        堆排序法的基本思想是:利用最小堆的性质来维护一个大小为K的堆,这样我们就可以在遍历数组的过程中不断更新这个堆,最终堆顶的元素就是我们要找的第K大的数。使用堆排序法求解本题的主要步骤如下。

        根据上面的算法步骤,我们可以得出下面的示例代码。

        1、导入heapq模块,使用它提供的heappush和heappop函数来操作堆。

        2、创建一个大小为K的空堆。

        3、遍历数组nums,对于每个元素x,进行以下操作。

        (1)如果堆的大小小于K,则直接将x插入堆中。

        (2)如果堆的大小等于K且x大于堆顶元素,则弹出堆顶元素,并将x插入堆中。

        4、最终,堆顶元素即为第K大的元素。

import heapq

def find_Kth_largest_element_by_min_heap(nums, k):
    # 创建一个大小为k的最小堆
    min_heap = []
    
    # 遍历数组中的每一个元素
    for num in nums:
        # 如果堆的大小小于k,则直接插入
        if len(min_heap) < k:
            heapq.heappush(min_heap, num)
        # 如果堆已满并且当前元素比堆顶元素大,则替换堆顶元素
        elif num > min_heap[0]:
            heapq.heapreplace(min_heap, num)
    
    # 堆顶元素即为第k大的元素
    return min_heap[0]

nums = [3, 2, 1, 5, 6, 4]
k = 2
print(find_Kth_largest_element_by_min_heap(nums, k))

nums = [50, 23, 66, 18, 72]
k = 3
print(find_Kth_largest_element_by_min_heap(nums, k))

总结

        快速选择算法的时间复杂度平均情况下为O(n),最坏情况下(每次选择的基准都是最小或最大值时)为O(n^2)。由于最坏情况下的性能较差,一般需要随机化选择基准来避免最坏情况的发生。堆排序法的时间复杂度为O(n*logK),这是因为每次插入和删除操作的时间复杂度为O(logK),总共有n次操作。

        总的来说,快速选择算法适用于大多数情况,特别是在K接近数组长度一半时。它不需要额外的存储空间(除了递归栈),而且通常情况下性能很好。堆排序法更适合于K相对于数组长度较小的情况,因为随着K的增加,性能会逐渐变差。另外,它需要额外的存储空间来维护堆。

💡 如果想阅读最新的文章,或者有技术问题需要交流和沟通,可搜索并关注微信公众号“希望睿智”。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python如何判断文件有多少行

如何统计读取的一个txt文本的行数呢&#xff1f; 最简单的办法是把文件读入一个大的列表中&#xff0c;然后统计列表的长度。如果文件的路径是以参数的形式filepath传递的&#xff0c;那么只用一行代码就可以完成我们的需求了&#xff1a; count len(open(filepath,rU).readl…

数字样机:惯性导航系统控制单元仿真

01.简介 惯性导航系统 (INS&#xff0c;Inertial Navigation System) 基于惯性原理建立&#xff0c;而惯性是物体自身的固有属性&#xff0c;因此其工作时既不依赖于外部信息&#xff0c;也不向外部辐射能量&#xff0c;优于卫星导航与无线电导航&#xff0c;是一种具备隐蔽性…

KEYSIGHT E5063A-006 无线功率传输分析

KEYSIGHT是德 E5063A-006 无线功率传输分析 E5063A-006 无线功率传输分析选件能够以任意负载阻抗设置&#xff0c;实时测量线圈或谐振器之间的无线功率传输效率&#xff08;WPT&#xff09;。基于测量结果进行的 2D/3D 分析&#xff0c;能够帮助用户更轻松地了解对负载阻抗的…

Selenium + Python 自动化测试07(滑块的操作方法)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 本篇文章主要讲述如何操作滑块。 目前很多系统登录或者注册的页面都有滑块相关的验证&#xff0c;selenium 中对滑块的基本操作采用了元素的拖曳的方式。需要用到Actiochains模…

市场惊人逆转:西格尔改口称降息紧迫性已减

最近&#xff0c;市场发生了惊人的逆转&#xff0c;让很多分析师和投资者感到意外。沃顿商学院教授**杰里米西格尔&#xff08;Jeremy Siegel&#xff09;**在短短三天内就改变了他对美联储政策的看法。此前&#xff0c;他曾呼吁美联储迅速降息&#xff0c;但现在他认为这种紧急…

五,搭建环境:辅助功能

五&#xff0c;搭建环境&#xff1a;辅助功能 文章目录 五&#xff0c;搭建环境&#xff1a;辅助功能编写登录失败异常编写常量类MD5 工具 (加密工具类)日志配置文件 编写登录失败异常 我们在 demo-module04-util 模块下&#xff0c;创建一个名为&#xff1a;com.rainbowsea.i…

10、MySQL-索引

目录 1、索引概述 2、索引结构 2.1 BTree 2.2 BTree 2.3 Hash 3、索引分类 4、索引语法 4.1 创建索引 4.2 查看索引 4.3 删除索引 5、SQL性能分析 5.1 SQL执行频率 5.2 慢查询日志 5.3 profile详情 5.4 explain执行计划 6、索引使用 6.1 验证索引效率 6.2 最左…

浪潮云服务器(Inspur)硬件监控指标解读

随着企业业务的快速发展&#xff0c;服务器的稳定运行变得愈发重要。浪潮云服务器以其高性能和稳定性&#xff0c;在数据中心中扮演着关键角色。为了确保服务器的稳定运行&#xff0c;监控易作为一款专业的IT基础设施监控软件&#xff0c;为浪潮云服务器提供了全面的硬件监控解…

Swift 中的函数式核心与命令式外壳:单向数据流

文章目录 前言函数式核心命令式外壳副作用可运行 Demo函数式核心部分命令式外壳部分副作用处理SwiftUI 界面代码运行截图代码解释 总结参考资料 前言 之前&#xff0c;我们讨论了在 Swift 中的函数式核心与命令式外壳的概念。其目标是通过值类型提取纯逻辑&#xff0c;并将副作…

Java智能之Spring AI:5分钟打造智能聊天模型的利器

前言 尽管Python最近成为了编程语言的首选&#xff0c;但是Java在人工智能领域的地位同样不可撼动&#xff0c;得益于强大的Spring框架。随着人工智能技术的快速发展&#xff0c;我们正处于一个创新不断涌现的时代。从智能语音助手到复杂的自然语言处理系统&#xff0c;人工智能…

【卫星遥感影像】国产遥感影像分类技术应用研究进展综述_论文推荐

影像分类是遥感影像信息提取中的基本问题之一和遥感影像应用的关键&#xff0c;为我国掌握本土信息资源自主权、满足国家的紧迫需求具有重大战略意义。本文将进行这篇遥感影像分类的论文推荐。 1. 论文引用 [1]胡杰,张莹,谢仕义.国产遥感影像分类技术应用研究进展综述[J].计算…

使用隔离式栅极驱动器的设计指南

本设计指南分为三部分&#xff0c;旨在讲解如何为电力电子应用中的功率开关器件选用合适的隔离栅极驱动器&#xff0c;并分享实战经验。本文为第一部分&#xff0c;主要包括隔离式栅极驱动器的介绍和选型指南。 本文引用地址&#xff1a; 安森美的隔离栅极驱动器专为满足 SiC…

阿里云CDN-边缘脚本EdgeScript的CI/CD实践

阿里云CDN-ES脚本CI/CD实践 背景环境项目代码结构及发布脚本代码1. 项目结构2. 发布工具代码 流水线配置1. 流程配置2. 脚本代码发布脚本说明0. 配置账户1. 清空测试环境&#xff08;回滚测试环境&#xff09;2. 执行脚本发布3. 发布&#xff08;测试环境推送到生产环境&#x…

java基础概念13-类和对象

一、面向对象OOP 类class&#xff1a;相同事物的共性的代码描述&#xff0c;所有类是引用数据类型。 对象&#xff08;实例&#xff09;instance&#xff1a;类的具体的一个个体的实物。 二、类的定义 在Java中&#xff0c;一个类&#xff08;Class&#xff09;是定义对象的…

【经验总结】ShardingSphere+Springboot-02 数据分片、标准分片算法、时间间隔分片算法

文章目录 三、分片算法配置3.1 数据分片3.1.2 垂直分片3.1.2 水平分片 3.2 &#xff08;标准&#xff09;分片算法3.2.1 INLINE 基于行表达式的分片算法 &#xff08;必须掌握&#xff09;关于是否开启范围查找 3.2.2 INTERVAL 时间范围分片算法 三、分片算法配置 3.1 数据分片…

vue2学习 -- 路由

文章目录 1. 相关理解2. 基本使用2.1 安装2.2 嵌套路由2.3 路由传参2.3.1 query2.3.2 路由的命名2.3.3 params 2.4 路由的props配置2.5 routerlink的replace属性 3. 编程式路由导航4. 缓存路由组件5. 两个新的生命周期钩子6. 路由守卫6.1 全局前置 / 后置路由守卫6.2 独享路由守…

Java面试题--JVM大厂篇之Java中Parallel GC的调优技巧与最佳实践

目录 引言&#xff1a; 正文&#xff1a; 1. 理解Parallel GC的工作原理 2. 常见痛点与解决方案 痛点一&#xff1a;长时间暂停 痛点二&#xff1a;频繁的Minor GC 痛点三&#xff1a;内存溢出 3. 调优参数推荐 4. 实战经验分享 结束语&#xff1a; 引言&#xff1a;…

海思AE模块Lines_per_500ms参数的意义

​ 基础知识 1秒(S)1000毫秒(ms)1000_000微妙(s)1000_000_000纳秒(ns) 1GHz1000Mhz1000_000KHz1000_000_000Hz 1Hz1/s 抗频闪原理 海思AE模块参数中有一个LinesPer500ms的参数&#xff0c;意思为500ms对应的曝光行数。此个参数和抗频闪有关。 我们知道&#xff1a; 50HZ…

SQL注入实例(sqli-labs/less-17)

0、初始网页 1、确定闭合字符 注入点在于password框&#xff0c;闭合字符为单引号 2、爆库名 1 and updatexml(1,concat(0x7e,database(),0x7e),1)# 1 and (select 1 from (select count(*),concat((select database()),floor(rand()*2))x from information_schema.tables gr…

【C语言】通讯录的实现(基本版和动态版)

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html &#x1f381;代码托管:C语言: C语言方向&#xff08;基础知识和应用&#xff09; (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、…