LeetCode 数组最第k大的元素

找出数组中第K大元素

题目地址: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++
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值