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

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

mid

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

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

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

示例 1:

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

示例 2:

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

快排思想

详见 https://leetcode.cn/problems/kth-largest-element-in-an-array/solution/partition-zhu-shi-by-da-ma-yi-sheng/

 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
30
31
32
33
34
35
func findKthLargest(nums []int, k int) int {
	var partition func(nums []int, l, r int) int
	partition = func(nums []int, l, r int) int {
		pivotPos := true // 基准值位置 true为前
		i, j := l, r
		for i < j {
			if nums[i] < nums[j] {
				// 逆序
				pivotPos = !pivotPos
				nums[i], nums[j] = nums[j], nums[i]
			}
			if pivotPos {
				j--
			} else {
				i++
			}
		}
		return i
	}

	left := 0
	right := len(nums) - 1

	for left < right {
		p := partition(nums, left, right)
		if p+1 == k {
			return nums[p]
		} else if p+1 < k {
			left = p + 1
		} else {
			right = p - 1
		}
	}
	return nums[right]
}

partition 的另一种写法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
partition = func(nums []int, l, r int) int {
		 pivot := nums[r]
		 for i := l; i < r; i++ {
		 	if nums[i] > pivot {
		 		nums[l], nums[i] = nums[i], nums[r]
				l++
		  	}
		 }
		nums[l], nums[r] = nums[r], nums[l]
		return l
}