LeetCode:215. 数组中的第K个最大元素——快速排序

🍎道阻且长,行则将至。🍓

🌻算法,不如说它是一种思考方式🍀


算法专栏: 👉🏻123


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

  • 题目描述:给定整数数组nums和整数** k**,请返回数组中第 k 个最大的元素。
    请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。
  • 来源:力扣(LeetCode)
  • 难度:中等
  • 提示:
    1 <= k <= nums.length <= 105
    -104 <= nums[i] <= 104

本题也出现在剑指offer II076. 数组中的第 k 大的数字,不过测试案例更友好。

🌴解题

对于本题最常规的解法就是先大到小排序,然后返回第k个元素即可,时间复杂度越低越好。
对于友好的测试案例,也可以使用大小为k的数组进行一次目标变量存储前k大的数。

1.排序法

1.1冒泡排序

最简单的是冒泡排序,方法非常简单,使用两层循环进行逐一遍历,时间复杂度为O(n2)。参考:冒泡排序☝

1.2快速排序

在这个题目要求的==O(n)==时间复杂度,冒泡法是无法通过的,因此考虑快一点的排序算法:快速排序。(大到小为例)
快速排序最直观的理解就是每次选择的key元素(或者基准)经过一趟排序后放在了最终所在的位置,也就是左边大于key元素,右边小于key元素。于是数组被区分为了两个子区间,再继续在两个子区间用同样的方法。这也被称之为分治策略,就是把大的问题变成一个个小的问题,最后组合起来。
例如数组:{4,2,3,5,6,1},对于其中的一次排序:
在这里插入图片描述
我们选取第一个元素为了key,下一个为p,最后一个为q。step1.q向遍历,遇到大于key的元素的位置停下来,step2.p向遍历,遇到小于key的停下来,然后交换pq的元素值。一直重复直到pq相遇,与key交换结束:
在这里插入图片描述
这是其中一种方法,还有挖坑填数、快慢指针:

  • 挖坑填数
    挖坑填数就是在上一个方法的基础上来的,选择的key元素先出来,q指针往左走发现大于key时就把这个元素出来,到上一个坑里,于是新坑出现了;然后p向右走,遇到小于key的也出来,到上一个坑里,一直这样的过程,直到pq相遇,将key最后入这个坑里。(指针是一直向坑遍历

在这里插入图片描述

  • 快慢指针fast、slow
    前面两种方法的指针都是从两端向中间,该方法的指针都是从左至右:都是从key的下一位往右走,快指针每走一步都会判断其指向的元素是否大等于key,若小于则交换两个指针的元素,并且让慢指针移动1位;直到fast遍历完全,slow退回一步(预期的向前了一步),交换slow和key。

在这里插入图片描述

快速排序和冒泡排序解题code:
class Solution076 {
   
    public static int findKthLargest(int[] nums, int k) {
   
        //排序
       // bobosort(nums);
        //快速排序
        fastsort(nums);


        return nums[k-1];
    }

    private static void fastsort(int[] nums) {
   
        int left=0,right= nums.length-1;
        myquicksort(nums,left,right);

    }
    private static void myquicksort(
### Wireshark 杂项分析在网络数据包捕获中的应用 Wireshark 是一种强大的网络协议分析工具,能够实时捕获和显示网络流量的详细信息。它支持多种网络层协议,并提供了丰富的过滤器和解析功能来帮助用户深入理解网络通信行为。 #### 功能概述 Wireshark 的核心功能之一是其全面的数据包捕获能力[^1]。通过使用内置的功能模块或者与其他工具(如 Snort 或 Suricata)集成,它可以实现更深层次的安全分析。例如,在网络安全领域中,可以利用 Bro 事件驱动机制或 OSSEC 基于主机的日志管理来进行综合威胁评估。 对于杂项(Miscellaneous, Misc)类型的网络数据分析而言,Wireshark 提供了一些特定选项用于处理非标准协议或其他特殊用途场景下的数据流: - **自定义解码器**: 用户可以通过编写 Lua 脚本来扩展 Wireshark 对新类型报文的支持。 ```lua -- 示例:创建一个新的 dissector 插件 function my_protocol.dissector(buffer,pinfo,tree) pinfo.cols.protocol = "MYPROTOCOL" local subtree = tree:add(my_protocol,"My Protocol Data") -- 解析字段... end ``` - **统计报告生成**: 利用 `Statistics` -> `Endpoints`, 可以查看不同服务之间的连接情况以及它们之间传输了多少字节等指标。 - **专家信息系统(Expert Information)**: 此特性会自动标记可能存在问题的地方比如重复ACKs、超时重传等问题以便进一步调查。 另外值得注意的是,在某些竞赛环境中也可能遇到 SSRF (Server Side Request Forgery) 类型漏洞练习材料,则可以从这里获取灵感 [^2]: https://github.com/shimmeris/CTF-Web-Challenges/tree/master/SSRF/34c3-2017-extract0r 最后提到的一个广泛资源列表涵盖了从机器人工程到软件开发等多个学科的知识体系结构描述 [^3], 这些都可以作为背景参考资料辅助我们更好地理解和运用像 wireshark 这样的专业级诊断调试利器完成复杂任务目标设定下的各项挑战! ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Super algorithm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值