LeetCode热题100 数组中的第K个最大元素

题目描述

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入 : 3,2,1,5,6,4, k = 2
输出: 5

示例 2:

输入 : 3,2,3,1,2,4,5,5,6, k = 4
输出: 4

提示:

1<=k<=nums.length<=1051 <= k <= nums.length <= 10^51<=k<=nums.length<=105
−104<=numsi<=104-10^4 <= numsi <= 10^4−104<=numsi<=104

思路

1 使用快速排序,每次只排序左边或者右边,理论上的复杂度为n + 2n\frac{2}{n}n2 + 4n\frac{4}{n}n4 + 8n\frac{8}{n}n8 + ... < 2n,所以时间复杂度为o(n)。

2 注意实际上的复杂度最差是o(n2n^2n2),这个参考快速排序的时间复杂度说明。

代码

cpp 复制代码
class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        return quick_sort(nums, nums.size() - k, 0, nums.size() - 1);
    }

    int quick_sort(vector<int>&nums, int k, int l, int r)
    {
        if(l == r)
        {
            return nums[k];
        }

        int mid = nums[l + r >> 1];
        int i = l - 1, j = r + 1;

        while(i < j)
        {
            do ++i; while(nums[i] < mid);
            do --j; while(nums[j] > mid);
            if(i < j) swap(nums[i], nums[j]);
        }

        if(k <= j) return quick_sort(nums, k, l, j);
        else return quick_sort(nums, k, j + 1, r);
    }

};
相关推荐
2401_8685347812 小时前
RTOS之RT-Thread & Linux:线程/进程管理与调度核心差异分析
c++·python
wabs66612 小时前
关于图论【卡码网117.软件构建的思考】
数据结构·算法·软件构建·图论·卡码网
mifengxing13 小时前
LeetCode 41.缺失的第一个正数|Hard题O(n)+O(1)最优解法深度解析
java·算法·leetcode·排序算法
郝学胜-神的一滴13 小时前
Qt 高级编程 040:按钮悬浮弹出滑块弹窗的完整攻略
开发语言·c++·qt·软件工程·用户界面
Tongzhi202613 小时前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法
Wang's Blog14 小时前
AI Agent白手起家30: 动态示例选择器之根据长度选择 Few Shot 示例
算法
oyguyteggytrrwwwrt15 小时前
自制交叉线路识别算法
算法
手写码匠15 小时前
华为云Flexus+DeepSeek征文|Dify 多智能体协同编排实战:R1 规划 + V3 执行,构建企业 Agent 团队
人工智能·深度学习·算法·aigc
晓天衡宇•评测社区16 小时前
FSR-Bench 前沿科学推理榜单发布:GPT-5.5 居首,“会推理”未必“能答对”
算法
程序喵大人17 小时前
【C++进阶】STL算法与函数对象 - 02 sort为什么需要随机访问迭代器
开发语言·c++·算法