分割槽的操作和快排一模一樣
這裡的虛擬碼實際找的是第k-1小的數 , 因此在這裡做了轉換
第k大的數 = 第len-k+1小的數 len=end+1
然後實際是找第k-1索引處的數 , 因此為end+1-k+1-1
(其實這裡的定義有點混亂了 , 不管怎樣第一次Accepted了 , 之後再改進 )
func partition(nums []int, start int, end int) int {
p := start
j := start + 1
i := start
v := nums[p]
for j <= end {
if nums[j] < v {
tmp1 := nums[j]
nums[j] = nums[i+1]
nums[i+1] = tmp1
i++
j++
} else if nums[j] >= v {
j++
}
}
tmp2:=nums[i]
nums[i]=nums[p]
nums[p]=tmp2
p=i
return p
}
func findKthLargest(nums []int, k int) int {
start:=0
end:=len(nums)-1
//實際找的是第k-1小的數 , 因此在這裡做了轉換
//第k大的數 = 第len-k+1小的數 len=end+1
//然後實際是找第k-1索引處的數 , 因此為end+1-k+1-1
return findKthLargestIn(nums,start,end,end+1-k+1-1)
}
func findKthLargestIn(nums []int, start int, end int, n int) int{
k:=partition(nums,start,end)
if k==n {
return nums[k]
}
if k<n {
return findKthLargestIn(nums,k+1,end,n)
}
if k>n {
return findKthLargestIn(nums,start,k-1,n)
}
return 0
}