题目地址:https://leetcode.cn/problems/kth-largest-element-in-an-array/description/
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。
// 数组中第k个最大的元素
// 算法思想:如果排序在第 len(nums) - k 的位置上的元素是什么
var a int = 0
var b int = 0
func findKthLargest(nums []int, k int) int {
return randomSelect(nums, len(nums)-k)
}
func randomSelect(nums []int, index int) int {
ans := 0
l := 0
r := len(nums) - 1
for l <= r {
// 使用随机可以使时间复杂度在期望上达到O(n)
x := nums[l+rand.Intn(r-l+1)]
partition(nums, l, r, x)
if index < a {
r = a - 1
} else if index > b {
l = b + 1
} else {
ans = nums[index]
break
}
}
return ans
}
func swap(nums []int, i, j int) {
t := nums[i]
nums[i] = nums[j]
nums[j] = t
}
func partition(nums []int, l, r, x int) {
// 比 x 小的元素都在a左边
// 比 x 大的元素都在a右边
a = l
b = r
i := l
for i <= b {
if x > nums[i] {
swap(nums, a, i)
a++
i++
} else if x < nums[i] {
swap(nums, b, i)
b--
} else {
i++
}
}
}
找出数组中第K大元素

被折叠的 条评论
为什么被折叠?



