215. 数组中的第K个最大元素

难度:中等
题目描述:
215. 数组中的第K个最大元素_第1张图片
思路总结
方法一:暴力,排序法。
方法二: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]

题解三结果:
在这里插入图片描述

你可能感兴趣的:(朱滕威的面试之路)