【Golang 刷题之路】转世重修第二百一十五题:数组中的第K个最大元素
Golang轻松学习一、数组中的第K个最大元素?
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、详细代码
1.理清题目思路
- 要求是什么?
此时给定了一个无序数组 nums,需要找出第k个最大的数 - 条件是什么?
第 k 个最大的元素 - 优化是什么?
由于只需要找出一个元素、那么我们不需要保证全部数组有序,只需要当找出第 k 个最大的元素,返回该元素
2.代码思路,带注释
代码如下(示例):
func findKthLargest(nums []int, k int) int {
// 传入元素进行查询
top(nums, len(nums)-k, 0, len(nums)-1)
return nums[len(nums)-k]
}
func top(nums []int,k,start,stop int) {
// 若数组长度为 1,则直接返回
if start >= stop {
return
}
// 进行单次快排,得出第一个对比数的索引
index := parition(nums,start,stop)
// 索引正好为 k,则 k 为第 k 个最大的元素
if index == k {
return
}
// 如果索引比k小,那么将索引右部进行单次快排
if index < k {
top(nums,k,index+1,stop)
// 如果索引比k大,那么将索引左部进行单次快排
} else if index > k {
top(nums,k,start,index-1)
}
}
// parition 单次快排
func parition(nums []int, start, stop int) int {
if start >= stop{
return -1
}
//将第一个数作为快排基准数
pivot := nums[start]
// 获得两个函数内部变量,作为快排左右指针
l, r := start, stop
// 如果左指针小于右指针,则继续排序
for l < r{
// 如果左指针小于右指针且右指针元素大于基准数
// 则该元素满足快排原则,右指针左移后再次判断
for l < r && nums[r] >= pivot{
r--
}
// 如果左指针小于右指针且左指针元素小于基准数
// 则该元素满足快排原则,左指针右移后再次判断
for l < r && nums[l] <= pivot{
l++
}
// 由于此时左右指针停止,则左指针元素大于基准数、右指针元素小于基准数
// 此时交换左右指针元素
nums[r],nums[l] = nums[l],nums[r]
}
// 循环退出、证明左右指针相遇,此时指针停留位置小于等于基准数
// 将基准数与指针数交换、此时基准数的位置即为指针位置
nums[l], nums[start] = nums[start], nums[l]
return l
}
结果
总结
数组中的第K个最大元素是面试常见问题、类似于无序数组找中位数。两种为同一做法,我们使用快排进行排序、也是题目考察要点,快排是常见考题、通过简单的左右指针进行横移来进行原数组内进行排序,相比于归并排序、节省了空间。完成了快排,我们的学习之路也才开始启程,路途遥远,只求风雨兼程。
希望这个博客能对你有所益处。我是轻王,我为自己代言。