本文介绍 LeetCode 题集中,有关排序的问题。
215. Kth Largest Element in an Array(数组中的第K个最大元素)
问题描述
思路与代码
解决本题时,笔者想到了一种比较取巧的方法,即寻找数组的最大值,将其修改为数值下限,如此循环 k-1 次,然后输出第 k 次的最大值即可。
代码如下:
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
min_num = -10 ** 5
for _ in range(k - 1):
index = nums.index(max(nums))
nums[index] = min_num # change the max number for k - 1 times, then return the max
return max(nums)
然而该方法运行效率并不高,但是很节约内存空间:
于是想到另一种方法,即参考快速排序的思路来解决。
代码如下:
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
# quicksort partition function
def partition(start: int, end: int) -> int:
pivot = nums[end] # use end as pivot
while start < end:
while start < end and nums[start] >= pivot:
start += 1
nums[end] = nums[start]
while start < end and nums[end] <= pivot:
end -= 1
nums[start] = nums[end]
nums[end] = pivot
return end
def quick_select(start: int, end: int, k_: int):
if start == end:
return nums[start]
index = partition(start=start, end=end)
n = index - start + 1
# cases: compare k and n
if n == k_:
return nums[index]
elif n > k_:
return quick_select(start=start, end=index - 1, k_=k_)
else:
return quick_select(start=index + 1, end=end, k_=k_ - n)
return quick_select(start=0, end=len(nums) - 1, k_=k)
该代码的实际运行效果也差强人意,而且比较消耗空间:
查看了一些比较高效的答案,大致有两类:
- 使用内置函数排序,然后选第 k 个值,老实讲,这种方法更为取巧,失去了自己编写代码实现的意义,个人认为没有参考价值
- 同样是快速排序的思路,但是笔者暂时没有发现和本文第二种方法在代码实现层面的差别,感觉思路上是没问题的,于是暂时搁置问题吧,如有新发现再做更新,并且随时欢迎交流