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<=nums[i]<=104-10^4 <= nums[i] <= 10^4−104<=nums[i]<=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);
    }

};
相关推荐
咖啡里的茶i18 分钟前
视觉显著目标的自适应分割与动态网格生成算法研究
人工智能·算法·目标跟踪
paeamecium33 分钟前
【PAT甲级真题】- String Subtraction (20)
数据结构·c++·算法·pat考试·pat
YL2004042639 分钟前
047从前序与中序遍历序列构造二叉树
算法·leetcode
极梦网络无忧40 分钟前
password_hash
算法·哈希算法
计算机安禾1 小时前
【c++面向对象编程】第25篇:仿函数(函数对象):重载operator()
开发语言·c++·算法
周末也要写八哥2 小时前
在C++中使用预定义宏
开发语言·c++·算法
学会870上岸华师2 小时前
C 语言程序设计——第一章课后编程题
c语言·开发语言·学习·算法
小小编程路2 小时前
新手快速学 Python 极简速成指南
开发语言·c++·python
小马过河R2 小时前
RAG检索优化策略:系统性四层框架解析
人工智能·python·算法·ai·llm·rag·问答
AI技术控3 小时前
论文解读:AE-TCN-SA——基于自编码器、TCN 与自注意力机制的锂电池内短路诊断方法
人工智能·python·深度学习·算法·机器学习·自然语言处理