LeetCode——0215.数组中的第K个最大元素

215.数组中的第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>源代码

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        nums.sort()
        return nums[-k]
import random
class Solution(object):
    def findKthLargest(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        if k > len(nums):
            return
        index = random.randint(0, len(nums) - 1)
        pivot = nums[index]
        small=[i for i in (nums[:index]+nums[index+1:])if i < pivot]
        large=[i for i in (nums[:index]+nums[index+1:])if i >= pivot]

        if k-1 == len(large):
            return pivot
        elif k-1<len(large):
            return self.findKthLargest(large,k)
        if k-1 > len(large):
                return self.findKthLargest(small,k-len(large)-1)

2>算法介绍

本题的代码中附上了两段代码,第一段代码是我在刚拿到这道题目的时候思考的。我以为这只是一道考察排序算法的衍生题,但看了解析之后我发现我理解错了。

当然,并不是说先排序再作答这个方法不对,但是题目希望我们掌握的是分治的方法,也就是利用快速排序。我们知道,快速排序的每一轮迭代后都会有一个元素被放在它最终的位置上,那么如果我们在迭代的过程中发现,这次被放好位置的元素正好放在了第k个最大元素应该放在的位置上,那么快速排序后面的步骤都不需要进行了!

当然我们还可以做更进一步的优化,如果发现这一次的迭代得到的元素位置q < 目标元素位置,就只递归右子区间,反之递归左子区间,提高了时间效率。

第二段代码参考

你可能感兴趣的:(LeetCode训练,leetcode,快速排序,算法)