题目描述
在未排序的数组中找到第 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
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
分析:
受启发于快速排序,每次排序完检查参考值的位置:
- 如果位置正好等于k,则返回;
- 否则,判断是继续从左边还是右边寻找k。
时间复杂度:
递归时,每层时间复杂度为O(n),仅第一层需左右两部分遍历,后面只需要遍历一半。
n+n/2+n/4+…+1 < 2n,所以总的时间复杂度为O(n)。
python代码:
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
return self.helper(nums, 0, len(nums)-1, k)
def helper(self, nums, l, r, k):
if l == r:
return nums[l]
i, j = l, r
p = nums[i]
while i < j:
while i < j and nums[j] <= p:
j -= 1
if i < j:
nums[i] = nums[j]
i += 1
while i < j and nums[i] >= p:
i += 1
if i < j:
nums[j] = nums[i]
j -= 1
if i + 1 == k:
return p
elif i + 1 < k:
return self.helper(nums, i + 1, r, k)
else:
return self.helper(nums, l, i - 1, k)
附快速排序代码:
def quick_sort(lst):
helper(lst, 0, len(lst)-1)
def helper(lst, l, r):
if l >= r:
return
i = l
j = r
p = lst[i]
while i < j:
while i < j and lst[j] >= p:
j -= 1
if i < j:
lst[i] = lst[j]
i += 1
while i < j and lst[i] <= p:
i += 1
if i < j:
lst[j] = lst[i]
j -= 1
lst[i] = p
helper(lst, l, i-1)
helper(lst, i+1, r)
更多题目包括leetcode、牛客网、各种排序算法解法参见个人GitHub,持续更新中,欢迎star ~~
https://github.com/PemLer/Journey_of_leetcode