LeetCode 题集:排序

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


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


问题描述

LeetCode 题集:排序_第1张图片

思路与代码


解决本题时,笔者想到了一种比较取巧的方法,即寻找数组的最大值,将其修改为数值下限,如此循环 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 个值,老实讲,这种方法更为取巧,失去了自己编写代码实现的意义,个人认为没有参考价值
  • 同样是快速排序的思路,但是笔者暂时没有发现和本文第二种方法在代码实现层面的差别,感觉思路上是没问题的,于是暂时搁置问题吧,如有新发现再做更新,并且随时欢迎交流

你可能感兴趣的:(LeetCode,算法与数据结构,leetcode,算法,职场和发展)