难度:中等
题目描述:
思路总结:
方法一:暴力,排序法。
方法二:partition思想
方法三:堆
参考阅读:
巨佬的三种思路详细题解
题解一:(瞎J8写)
一行解决战斗,然后面试就挂了。
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
return sorted(nums)[len(nums)-k]
题解一结果:
题解二:(partition思想)
partition的话,左边都比pivot小,右边都比pivot大。(这里有一个疑问待解决,为什么总是能保证找到target?)
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
size = len(nums)
target = size - k
left, right= 0, size-1
while True:
index = self.partation(nums, left, right)
if index == target:
return nums[index]
elif index < target:
left = index + 1
else:
right = index - 1
def partation(self, nums, left, right):
pivot = nums[left]
j = left
for i in range(left+1, right+1):
if nums[i] < pivot:
j+=1
nums[j], nums[i] = nums[i], nums[j]
nums[j], nums[left] = nums[left], nums[j]
return j
#使用随机初始化pivot改进版
题解二结果:
随机初始化后提升了不少,所以推断有最差的用例,即逆序排序的列表。
题解三:(优先队列)★★★
import heapq
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
heap = []
for n in nums:
if len(heap) < k:
heapq.heappush(heap, n)
elif n > heap[0]:
heapq.heapreplace(heap, n)
return heap[0]