【Golang 刷题之路】转世重修第二百一十五题:数组中的第K个最大元素

【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.理清题目思路

  1. 要求是什么?
    此时给定了一个无序数组 nums,需要找出第k个最大的数
  2. 条件是什么?
    第 k 个最大的元素
  3. 优化是什么?
    由于只需要找出一个元素、那么我们不需要保证全部数组有序,只需要当找出第 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个最大元素是面试常见问题、类似于无序数组找中位数。两种为同一做法,我们使用快排进行排序、也是题目考察要点,快排是常见考题、通过简单的左右指针进行横移来进行原数组内进行排序,相比于归并排序、节省了空间。完成了快排,我们的学习之路也才开始启程,路途遥远,只求风雨兼程。

希望这个博客能对你有所益处。我是轻王,我为自己代言。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫轻王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值