题解 | #寻找第K大#

寻找第K大

https://www.nowcoder.com/practice/e016ad9b7f0b45048c58a9f27ba618bf

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param a int整型一维数组
 * @param n int整型
 * @param K int整型
 * @return int整型
 */
func findKth(a []int, n int, K int) int {
	// write code here
	K = n - K // 第k大的数在排序数组中索引为 n - k 的位置
	left, right := 0, n-1
	for left <= right {
		privotIndex := partition(a, left, right)
		// privotIndex == len - k  即当前为第K个大元素
		// privotIndex < len - k   在[privoteIndex + 1,right]中继续查找
		// privotIndex > len - k   在[left,privoteIndex - 1]中继续查找
		if privotIndex == K {
			return a[privotIndex]
		} else if privotIndex < K {
			left = privotIndex + 1
		} else {
			right = privotIndex - 1
		}
	}
	return -1
}

// partition 函数使用数组的第一个元素作为基准
func partition(a []int, left, right int) int {
	pivot := a[left] // 使用第一个元素作为基准
	i := left + 1    // 从基准的下一个元素开始
	for j := right; j >= i; {
		if a[j] > pivot { // 当找到一个大于基准的元素时,将它保持在右边
			j--
		} else {
			// 小于等于基准的元素移动到左边
			a[i], a[j] = a[j], a[i]
			i++
		}
	}
	// 最后,将基准元素移动到正确的位置
	a[left], a[i-1] = a[i-1], pivot
	return i - 1 // 返回基准元素的最终位置
}

全部评论

相关推荐

02-05 08:49
已编辑
武汉大学 Web前端
野猪不是猪🐗:36k和36k之间亦有差距,ms的36k和pdd的36k不是一个概念
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务