- 数组中的第K个最大元素
# class Solution:
# def findKthLargest(self, nums: List[int], k: int) -> int:
# if len(nums)<k:
# return
# low = 0
# high = len(nums) - 1
# self.quicksort(nums,low,high,k)
# return nums[len(nums) - k]
# def quicksort(self,nums,low,high,k):
# index = self.partition(nums,low,high)
# if index < len(nums) - k:
# low = index + 1
# elif index > len(nums) - k:
# high = index - 1
# else:
# return
# self.quicksort(nums,low,high,k)
# def partition(self,nums,low,high):
# povit = nums[low]
# while low < high:
# while low < high and nums[high] >= povit:
# high -= 1
# nums[low] = nums[high]
# while low < high and nums[low] < povit:
# low += 1
# nums[high] = nums[low]
# nums[low] = povit
# return low
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
if len(nums)<k:
return
heapsize = len(nums)
self.buildheap(nums,heapsize)
for i in range(len(nums)-1,len(nums)-1-k,-1):
nums[0],nums[i] = nums[i], nums[0]
heapsize -= 1
self.maxheapify(nums,heapsize,0)
return nums[len(nums)-k]
def buildheap(self,nums,heapsize):
for i in range(heapsize//2,-1,-1):
self.maxheapify(nums,heapsize,i)
def maxheapify(self,nums,heapsize,i):
left = i * 2
right = i * 2 + 1
largest = i
if left < heapsize and nums[largest] < nums[left]:
largest = left
if right < heapsize and nums[largest] < nums[right]:
largest = right
if largest!=i:
nums[largest], nums[i] = nums[i], nums[largest]
self.maxheapify(nums,heapsize,largest)
快排与堆排的方法
时间复杂度O(n)
堆排序,建堆O(n),重建堆一次O(klogn),时间复杂度O(nlogn)
总结:这个之所以堆排是n个数的堆排,是因为在原数组上操作的,不费空间,如果像之前的频次,需要哈希表先统计的话,那么肯定是k个数的堆排