解法一:
排序然后输出第K大 时间复杂度O(nlogn)
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
if not nums:
return None
nums.sort()
return nums[-k]
解法二:
快排
快排的基本实现:
def quick(nums,start,end):
if start>end:
return
low = start
high = end
flag = nums[start]
while low<high:
while low<high and nums[high]>=flag:
high-=1
nums[low] = nums[high]
while low<high and nums[low]<flag:
low+=1
nums[high] = nums[low]
nums[low] = flag
quick(nums,start,low-1)
quick(nums,low+1,end)
对数组用快排从大到小进行排序,当划分的key正好落在K位置时,直接返回,不需要在继续排
class Solution:
def findKthLargest(self, nums, k) :
return self.quick(nums,0,len(nums)-1,k)
def quick(self,nums,start,end,k):
if start<=end:
low = start
high = end
flag = nums[start]
while low<high:
while low<high and nums[high]<flag:
high-=1
nums[low] = nums[high]
while low<high and nums[low]>=flag:
low+=1
nums[high] = nums[low]
nums[low] = flag
if (low+1)==k:
print(nums[low])
return nums[low]
elif low+1<k:
return self.quick(nums,low+1,end,k)
else:
return self.quick(nums,start,low-1,k)
解法三:
哈希
class Solution:
def findKthLargest(self, nums, k) :
if not nums:
return None
max_ = min_ = nums[0]
for i in nums:
max_ = max(i,max_)
min_ = min(i,min_)
cnt = [0 for i in range(min_,max_+1)]
for i in nums:
cnt[max_-i]+=1
sum = 0
for i, v in enumerate(cnt):
sum+=v
if sum>=k:
return max_-i