算法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 <= nums[i] <= 104
题解一(面试中不要使用)
class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:return sorted(nums)[len(nums)-k]
题解二
class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:# 快速排序的变种,用于在未排序列表中查找第k小/大的元素def quick_select(nums,k):# 随机选择基准数pivot = random.choice(nums)big, equal, small = [],[],[]# 将大于、小于、等于pivot的元素划分至big,small,equal中for num in nums:if num>pivot:big.append(num)elif num<pivot:small.append(num)else:# 这里也可以用equal.append(num),不影响返回结果pivot=numif k <= len(big):# 第k大元素在big中,递归划分return quick_select(big,k)if k > len(nums)-len(small):# 表示k在small内# 第k大元素在small中,递归划分return quick_select(small,k-len(nums)+len(small))# 第k大元素在equal中,递归划分return pivotreturn quick_select(nums,k)
解题思路,来自leetcode大佬
- 快速排序的核心包括“哨兵划分” 和 “递归” 。
哨兵划分: 以数组某个元素(一般选取首元素)为基准数,将所有小于基准数的元素移动至其左边,大于基准数的元素移动至其右边。
递归: 对 左子数组 和 右子数组 递归执行 哨兵划分,直至子数组长度为 1 时终止递归,即可完成对整个数组的排序。
下图展示了数组 [2,4,1,0,3,5] 的快速排序流程。

