Leetcode 215.数组中的第K个最大元素(Kth Largest Element in an Array)

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

1 题目描述(Leetcode题目链接

  在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4

说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

2 题解

  排序就可以了,这是堆排序的做法,由于只返回第k个大的,所以不用全排。更多关于堆/优先队列

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        heap_size = len(nums)
        def MAX_HEAPIFY(i):  #维护最大堆的性质
            l = 2*i + 1
            r = 2*i + 2
            if l < heap_size and nums[l] > nums[i]:
                largest = l
            else:
                largest = i
            if r < heap_size and nums[r] > nums[largest]:
                largest = r
            if i != largest:
                nums[i], nums[largest] = nums[largest], nums[i]
                MAX_HEAPIFY(largest)
        for i in range(heap_size//2 - 1, -1, -1):    #建堆
            MAX_HEAPIFY(i)

        for i in range(k-1):   #堆排序
            nums[0], nums[heap_size-1] = nums[heap_size-1], nums[0]
            heap_size -= 1
            MAX_HEAPIFY(0)

        return nums[0]

内置函数是真的快。

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        nums.sort()
        return nums[-k]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值