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

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入: `[3,2,1,5,6,4],` k = 2
输出: 5

示例 2:

输入: `[3,2,3,1,2,4,5,5,6],` k = 4
输出: 4

提示:

  • 1 <= k <= nums.length <= 105
  • -104 <= nums[i] <= 104

快速选择法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
func findKthLargest(nums []int, k int) int {
n := len(nums)
return quickselect(nums, 0, n-1, n-k)
}

func quickselect(nums []int, l, r, k int) int {
if l == r {
return nums[k]
}

dummy := nums[l]
i := l-1
j := r+1

for i<j {
for i++; nums[i]<dummy ; i++ {}
for j--; nums[j]>dummy ; j-- {}
if i<j {
// swap
nums[i], nums[j] = nums[j], nums[i]
}
}

if k<=j {
return quickselect(nums, l, j, k)
} else {
return quickselect(nums, j+1, r, k)
}
}