topk问题
思路
把数组分成两个区间,取某个元素s当做中间值,比s大的放左区间,比s小的放右区间,记录和s相等的元素数量。然后通过区间的长度判断这个要找的元素在哪个区间中。
如果左区间 < k, 那就说明元素在右区间或者相等的s中。 反之,说明在左区间或者相等的s中。之后的问题就变成从左区间或右区间中找第k-n大的元素
Code
func findKthLargest(nums []int, k int) int {
midNum := nums[0]
leftSlice, rightSlice := []int{}, []int{}
num := 0
for _, v := range nums {
if v > midNum {
leftSlice = append(leftSlice, v)
} else if v < midNum {
rightSlice = append(rightSlice, v)
} else {
num++
}
}
// 终止条件: 左边切片长 = k-1
if len(leftSlice) < k && len(leftSlice)+num >= k {
return midNum
}
if len(leftSlice) < k {
return findKthLargest(rightSlice, k-len(leftSlice) - num)
}
return findKthLargest(leftSlice, k)
}