题目描述
https://leetcode-cn.com/problems/kth-largest-element-in-an-array
思路题解
方法一:普通法
把每次的最大值求出来,删除掉,直到第k次,输出最大值
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
if not nums:return -1
for i in range(k-1):
del nums[nums.index(max(nums))]
return max(nums)
方法二:随机pivot快排
用快排进行排序,利用快排的partition思想(即分治法,每次确定好某个元素的最终位置,再确定其左右区间内元素的位置),判断k和当前确定的元素的位置的关系。注意在选取一开始的基准元素时,要随机的选取,不然测试用例中有极端用例会造成超时。
python代码
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
def quicksort_randpivot(left,right):
if left>right:return -1
i,j=left,right
#随机的选取pivot
ra=random.randint(left,right)
nums[left],nums[ra]=nums[ra],nums[left]
tmp=nums[left]
while j>i:
while nums[j]>=tmp and j>i:
j-=1
nums[i]=nums[j]
while nums[i]<tmp and j>i:
i+=1
nums[j]=nums[i]
nums[i]=tmp
#判断k和当前确定的元素的位置的关系
if i ==len(nums)-k:
return nums[i]
elif i>len(nums)-k:
return quicksort_randpivot(left,i-1)
else:
return quicksort_randpivot(i+1,right)
return quicksort_randpivot(0,len(nums)-1)
go代码
import (
random "math/rand"
"time"
)
func findKthLargest(nums []int, k int) int {
return quicksort_randpivot(0,len(nums)-1,k,nums)
}
func quicksort_randpivot(left,right,k int,nums []int)int{
if left>right{
return -1
}
rand:=genRand(left,right)
//交换
nums[rand],nums[left]=nums[left],nums[rand]
tmp:=nums[left]
i,j:=left,right
for i<j{
for nums[j]>=tmp && i<j{
j--
}
nums[i]=nums[j]
for nums[i]<=tmp && i<j{
i++
}
nums[j]=nums[i]
}
nums[i]=tmp
if i == len(nums)-k{
return nums[i]
}else if i > len(nums)-k{
return quicksort_randpivot(left,i-1,k,nums)
}else {
return quicksort_randpivot(i+1,right,k,nums)
}
}
func genRand(left,right int)int {
random.Seed(time.Now().UnixNano())
return random.Intn(right-left+1)+left //[0,right-left+1)+left=[left,right+1)
}