【leetcode100】数组中的第K个最大元素

1、题目描述

给定整数数组 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

2、初始思路

2.1 思路1

直接使用sort进行递增排序,直接找到,但忽略了题目中对时间复杂度的要求。sort排序代码的时间复杂度为O(NlogN).

复制代码
class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        nums.sort(reverse = True)
        return nums[k-1]

2.2 思路2

看题目属于堆中的定义,了解了堆之后,使用堆的最大堆进行实现。但此时,由于元素的出栈和入栈,时间复杂度仍然不符合要求。

复制代码
class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        heap = []
        for num in nums:
            heapq.heappush(heap, num)
            if len(heap) > k:
                heapq.heappop(heap)
        return heap[0]

3 优化算法

3.1 思路

使用分治的方法进行求解,首先随机挑选一个nums中的元素作为基准,根据该基准确定low, equal和high,从而分开进行求解。

复制代码
class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        def quickSort(nums, k):
            mid = random.choice(nums)
            low, equal, high = [], [], []
            for num in nums:
                if num<mid:
                    low.append(num)
                elif num>mid:
                    high.append(num)
                else:
                    equal.append(num)
            if len(high) >= k:
                return quickSort(high, k)
            elif len(equal) + len(high) >= k:
                return mid
            else:
                return quickSort(low, k - len(equal) - len(high))
        return quickSort(nums, k)

3.2 注意!

刚开始选取元素时,选取了最左侧的元素进行求解,但忽略了如果原数组是按照递增或者递减的顺序进行排列的话,那么每次分治只能去掉一个元素,每次递归处理的数据量:n + (n-1) + (n-2) + ... ≈ n²/2,时间复杂度退化为 O(n²)。

4 总结

当看到复杂度要求为O(N)的排序类型的题时,可以优先考虑能否使用分治发进行求解,二分法也属于分治法的一种。

相关推荐
傻啦嘿哟20 分钟前
Python SQLite模块:轻量级数据库的实战指南
数据库·python·sqlite
Q_Q51100828529 分钟前
python+django/flask+uniapp基于微信小程序的瑜伽体验课预约系统
spring boot·python·django·flask·uni-app·node.js·php
XueminXu32 分钟前
Python读取MongoDB的JSON字典和列表对象转为字符串
python·mongodb·json·pymongo·mongoclient·isinstance·json.dumps
techdashen41 分钟前
12分钟讲解Python核心理念
开发语言·python
手握风云-42 分钟前
优选算法的寻踪契合:字符串专题
算法
jie*1 小时前
小杰机器学习(nine)——支持向量机
人工智能·python·机器学习·支持向量机·回归·聚类·sklearn
闭着眼睛学算法1 小时前
【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·javascript·c++·python·算法·华为od
IT古董1 小时前
【第五章:计算机视觉-项目实战之目标检测实战】2.目标检测实战:中国交通标志检测-(2)中国交通标志检测数据格式转化与读取
算法·目标检测·计算机视觉
郝学胜-神的一滴1 小时前
谨慎地迭代函数所收到的参数 (Effective Python 第31条)
开发语言·python·程序人生·软件工程
MobotStone1 小时前
LLM 采样入门到进阶:理解与实践 Top-K、Top-P、温度控制
算法