LeetCode No.215 Kth Largest Element in an Array

题目:

即在给定数组中,找第k大的数。

思路:

一开始,我想到的是把数组构建成为最大堆,然后让nums[-1]与nums[0]交换,然后减少nums的长度,反复做k次。提交后,时间复杂度超了。后来修改为用nums的前k个元素,构建最小堆,则堆顶元素nums[0]为最小值,令nums[i]=nums[k:]如果nums[i]小于nums[0],则舍弃nums[i](此时nums[i]必不可能是第k大,因为已经有k个元素比它大)。否则,则把nums[i]与nums[0]交换,然后重调堆。最后nums[0]即为第k大的元素。

代码:

class Solution():
    def makeMinHeap(self,nums,k):
        #建立最小堆
        length = k
        i = (int)((length)/2)-1
        while i >= 0:
            left = 2*i+1
            right = 2*i+2
            if left < length and nums[left] < nums[i]:
                nums[left],nums[i]=nums[i],nums[left]
            if right < length and nums[right] < nums[i]:
                nums[right],nums[i]=nums[i],nums[right]
            i -= 1
        return
    def findKthLargest(self,nums, k):
        self.makeMinHeap(nums,k)
        i = k
        while i < len(nums):
            if nums[i] > nums[0]:
                nums[i],nums[0]=nums[0],nums[i]
                self.makeMinHeap(nums,k)
            i += 1
        return nums[0]

结果:

注:

一开始由于不熟悉python,想着在函数中传递nums[0:k],然后构建堆,写成了self.makeMinHeap(nums[:k]),结果导致变成了传递副本,导致出错。

猜你喜欢

转载自blog.csdn.net/qq_39178023/article/details/80153528