215. 数组中的第K个最大元素

84 阅读1分钟

215. 数组中的第K个最大元素

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)
}