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

文章目录

题目

堆:215. 数组中的第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 <= 105

-104 <= numsi <= 104

代码

cpp 复制代码
class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
       srand(time(0));
        return quickSelect(nums, k);
    }
    int quickSelect(vector<int> &nums, int k) {
        // 随机选择基准
        int pivot = nums[rand() % nums.size()];
        
        vector<int> left, mid, right;
        
        for (int x : nums) {//划分三个区间
            if (x > pivot) left.push_back(x);   
            else if (x == pivot) mid.push_back(x); 
            else right.push_back(x);          
        }
        
        // 第k大在左边
        if (k <= left.size()) {
            return quickSelect(left, k);
        }
        // 第k大在中间
        else if (k <= left.size() + mid.size()) {
            return pivot;
        }
        // 第k大在右边,更新k
        else {//left 和 mid 里的所有数,都比 right 里的数大,k 必须把它们的数量减掉,才是在右边数组里真正的排名。
            return quickSelect(right, k - left.size() - mid.size());
        }
    } 
};

原理图

原理解释

提示:算法流程及解释在代码中已标注

方法1:堆排序

直接进行堆排序,然后取第四大的数

时间复杂度:O(nlogn)

空间复杂度:O(logn)到O(n)

方法2:使用堆排序维护四个元素的小顶堆

从头遍历整个数组,构建四个元素的小顶堆,若不够四个元素则一直加入,够了四个元素判断若数组当前元素比堆顶大则弹出堆顶,将数组的当前元素加入,否则跳过。

最后遍历完整个数组,堆顶元素即为数组中的第K个最大元素

时间复杂度:O(nlogk)

空间复杂度:O(K)

当K比较小的时候高效

方法3:快速选择算法

1、借鉴快速排序的分区思想

2、每轮随机选pivot,分三区:左(> pivot)、中(= pivot)、右(<

pivot)

k≤|左|→递归左区;k≤|左|+中→pivot即答案;否则递归右区

若pivot在第K个位置则为答案,如果第k个位置在pivot的左边,说明答案在pivot大的那部分里,若第k个位置在右边,就在右边部分继续找。

平均时间复杂度:O(n)

最坏时间复杂度:O(n方) 因为选取了pivot最后基本不会出现

平均空间复杂度:O(n)

相关推荐
智者知已应修善业23 分钟前
【51单片机8位数码管同时倒计时从9999】2024-1-25
c++·经验分享·笔记·算法·51单片机
洛水水26 分钟前
【力扣100题】86.柱状图中最大的矩形
算法·leetcode·职场和发展
渡之33 分钟前
GRiM-Net 深度解析 | 无人机 GNSS 拒止场景下两阶段跨视角视觉定位框架
深度学习·算法·动态规划·无人机
测试仪器廖生135902563851 小时前
罗德与施瓦茨 FSP13频谱分析仪FSP30
网络·人工智能·算法
happymaker06261 小时前
LeetCodeHot100——560.和为K的子数组
算法
dtq04241 小时前
C语言刷题数组5,6(求平均值,求最大值)
c语言·数据结构·算法
郭梧悠1 小时前
Hash算法入门Hash冲突解决方案
算法·哈希算法
洛水水2 小时前
【力扣100题】81.寻找两个正序数组的中位数
数据结构·算法·leetcode
happymaker06263 小时前
LeetCodeHot100——155.最小栈
算法
洛水水3 小时前
【力扣100题】85.每日温度
算法·leetcode·职场和发展