题目:数组中第K大的数字
题目链接:LeetCode-215. 数组中的第K个最大元素
思路分析:快速排序 + 剪枝
- 在上一关我们学了快速排序,所以这里只需要排序完该数组,再通过下标
nums[length-k]
就能得到目标元素。 - 不过可以加上剪枝操作,可以提高该函数的查找效率。即:每轮排序之后就能明确该轮基准值索引,只需要比较
length-k
和基准值索引
的大小:(我们定的前提是排序为升序,如果是逆序相反操作即可)- 和
基准值索引
一致,说明基准值就是目标元素,直接返回即可。 - 比
基准值索引
大,说明在右边,继续排序右边部分即可。 - 比
基准值索引
小,说明在左边,继续排序左边部分即可。
- 和
Go代码
func findKthLargest(nums []int, k int) int {
length := len(nums)
sortArr(nums, 0, length-1, length-k)
return nums[length-k]
}
func sortArr(nums []int, left int, right int, k int) {
if left >= right {
return
}
start, end := left, right
pivot := nums[left]
for left<right {
for left<right && nums[right]>pivot {
right--
}
if left<right {
nums[left] = nums[right]
left++
}
for left<right && nums[left]<pivot {
left++
}
if left<right {
nums[right] = nums[left]
right--
}
}
nums[left] = pivot
if left == k {
return
}
if left < k {
sortArr(nums, left+1, end, k)
} else {
sortArr(nums, start, left-1, k)
}
}