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);
    }

};
相关推荐
彧azz33 分钟前
算法设计与分析:贪心与动态规划
数据结构·学习·算法·贪心算法·动态规划
Beyond_System|系统之外1 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
景熙55232 小时前
15.Java 8 Stream 流入门到实战
java·开发语言·数据结构
汉克老师3 小时前
GESP2026年9月认证C++六级( 第三部分编程题(1、数组划分))精讲
c++·gesp·小学生·学c++编程
千里码aicood3 小时前
基于PLC与机器视觉的智能分拣控制系统设计
c++·自动化·plc
漂流瓶jz3 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
圣保罗的大教堂3 小时前
leetcode 835. 图像重叠 中等
leetcode
朽棘不雕3 小时前
进一步了解模板
c++
叠层归一研究院4 小时前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi
Selvaggia6 小时前
Diffusion Model 的基本原理与模型架构
算法