题目:
即在给定数组中,找第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]),结果导致变成了传递副本,导致出错。