LeetCode 题集:排序

本文介绍 LeetCode 题集中,有关排序的问题。


215. Kth Largest Element in an Array(数组中的第K个最大元素)


问题描述

LeetCode 215 问题描述

思路与代码


解决本题时,笔者想到了一种比较取巧的方法,即寻找数组的最大值,将其修改为数值下限,如此循环 k-1 次,然后输出第 k 次的最大值即可。

代码如下:

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        min_num = -10 ** 5
        for _ in range(k - 1):
            index = nums.index(max(nums))
            nums[index] = min_num  # change the max number for k - 1 times, then return the max

        return max(nums)

然而该方法运行效率并不高,但是很节约内存空间:
LeeyCode 215 运行效果 1

于是想到另一种方法,即参考快速排序的思路来解决。

代码如下:

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        # quicksort partition function
        def partition(start: int, end: int) -> int:
            pivot = nums[end]  # use end as pivot

            while start < end:
                while start < end and nums[start] >= pivot:
                    start += 1
                nums[end] = nums[start]

                while start < end and nums[end] <= pivot:
                     end -= 1
                nums[start] = nums[end]

            nums[end] = pivot

            return end

        def quick_select(start: int, end: int, k_: int):
            if start == end:
                return nums[start]

            index = partition(start=start, end=end)
            n = index - start + 1

            # cases: compare k and n
            if n == k_:
                return nums[index]
            elif n > k_:
                return quick_select(start=start, end=index - 1, k_=k_)
            else:
                return quick_select(start=index + 1, end=end, k_=k_ - n)

        return quick_select(start=0, end=len(nums) - 1, k_=k)

该代码的实际运行效果也差强人意,而且比较消耗空间:
LeetCode 215 运行效果 2

查看了一些比较高效的答案,大致有两类:

  • 使用内置函数排序,然后选第 k 个值,老实讲,这种方法更为取巧,失去了自己编写代码实现的意义,个人认为没有参考价值
  • 同样是快速排序的思路,但是笔者暂时没有发现和本文第二种方法在代码实现层面的差别,感觉思路上是没问题的,于是暂时搁置问题吧,如有新发现再做更新,并且随时欢迎交流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值