题目地址(215. 数组中的第K个最大元素)
https://leetcode.cn/problems/kth-largest-element-in-an-array/
题目描述
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 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
前置知识
公司
- 暂无
思路
关键点
代码
- 语言支持:Python3
Python3 Code:
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
"""
返回数组中第k个最大的元素
Args:
nums(List[int]):数组
k(int):第k大
Returns:
返回数组中第k个最大的元素
解决方法:
1. 采用最小堆(大小为k),遍历数组,最后返回堆顶元素
2. 采用快排的思想 通过交换 知道得到位置为k的元素
"""
heap = []
for x in nums:
# 保证堆的大小 小于等于k
if len(heap) < k:
heapq.heappush(heap,x)
else:
# 如果堆顶元素小于x 加入x(维护最大的k个元素)
if heap[0] < x:
heapq.heappop(heap)
heapq.heappush(heap,x)
return heap[0]
复杂度分析
令 n 为数组长度。
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
"""
返回数组中第k个最大的元素
Args:
nums(List[int]):数组
k(int):第k大
Returns:
返回数组中第k个最大的元素
解决方法:
1. 采用最小堆(大小为k),遍历数组,最后返回堆顶元素
2. 采用快排的思想 通过交换 知道得到位置为k的元素
"""
# 随机选择一个哨兵 放到正确的位置
k = len(nums)-k
import random
def partition(nums,l,r):
ind = random.randint(l,r)
nums[l],nums[ind] = nums[ind],nums[l]
pivot = nums[l]
i,j = l,r
while i<j:
while i<j and nums[j] >= pivot:
j -= 1
nums[i] = nums[j]
while i<j and nums[i] <= pivot:
i += 1
nums[j] = nums[i]
nums[i] = pivot
return i
def topKSplit(nums,l,r):
i = partition(nums,l,r)
if i == k:
return nums[i]
elif i < k:
return topKSplit(nums,i+1,r)
else:
return topKSplit(nums,l,i-1)
return topKSplit(nums,0,len(nums)-1)
复杂度分析
令 n 为数组长度。
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( 1 ) O(1) O(1)