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

在未排序的数组中找到第 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


归并排序

class Solution(object):
    def findKthLargest(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        nums = self.mergeSort(nums)
        return nums[k-1]

    def mergeSort(self, nums):
        if len(nums) <= 1:
            return nums  
        n = len(nums)-1
        mid = n >> 1
        left = self.mergeSort(nums[:mid+1])
        right = self.mergeSort(nums[mid+1:])
        sorted_nums = []
        while left and right:
            if left[0] >= right[0]:
                sorted_nums.append(left.pop(0))
            else:
                sorted_nums.append(right.pop(0))
        if left:
            sorted_nums = sorted_nums + left
        else:
            sorted_nums = sorted_nums + right
        return sorted_nums

最大堆

class Solution(object):
    def findKthLargest(self, nums, k):
        
        def maxHeap(nums, i, length):
            l = 2*i+1
            r = 2*i+2
            large = i
            if l < length and nums[l] > nums[large]:
                large = l
            if r < length and nums[r] > nums[large]:
                large = r
            if i != large:
                nums[i],nums[large] = nums[large], nums[i]
                maxHeap(nums,large,length)

        def buildMaxHeap(nums, length):
            for i in range(length/2,-1,-1):
                maxHeap(nums,i,length)

        heapSize = len(nums)
        buildMaxHeap(nums,heapSize)
        for i in range(heapSize-1,heapSize-k,-1):
            nums[0],nums[i] = nums[i], nums[0]
            heapSize -= 1
            maxHeap(nums, 0, heapSize)
        return nums[0]

我们也可以使用堆排序来解决这个问题——建立一个大根堆,做 k−1 次删除操作后堆顶元素就是我们要找的答案。首先我们需要建立一个最大堆。对于一个二叉堆来讲,我们需要对所有的非叶子节点的根节点进行下沉。具体的步骤是比对他的左右儿子,如果是最大堆我们需要大的数字在上面,小的数字在下面,那么如果根节点比两个儿子都大,则不发生变化,如果比儿子小就会发生下沉,并且是与较大的那个儿子节点进行交换,在交换完毕后再对其交换的节点进行递归调用,最后一直下沉直到不能下沉为止。当我们遍历完所有的非叶节点之后,最大堆就构建完成了。之后我们只要每次从堆顶删除一个最大值(其实是将其与堆的最后一个叶子进行互换,然后让size-1),然后从最顶开始调整,进行k-1次后,此时在堆顶的就是第k大的元素了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值