Leetcode 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

说明:

你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

**难度**: Medium

**标签**: 堆、 分治算法、


# -*- coding: utf-8 -*-
# @Author  : LG

"""
执行用时:1732 ms, 在所有 Python3 提交中击败了12.27% 的用户
内存消耗:14 MB, 在所有 Python3 提交中击败了60.77% 的用户

解题思路:
    冒泡排序
    通过判断k与nums的长度,决定排序方向
"""
class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        n = len(nums)
        if n < 2:
            return nums[k-1]
        if k > n/2: # 如果 k>nums长度的一半
            for j in range(n-1):
                for i in range(n-1-j):
                    if nums[i] < nums[i + 1]:   # 从大到小拍,每次将最小值放到末尾
                        nums[i], nums[i + 1] = nums[i + 1], nums[i]
                if j > n-k-1:
                    return nums[k-1]    # 取第k-1个则为第k个最大值
        else:       # 如果大于长度一半
            for j in range(n-1):
                for i in range(n-1-j):
                    if nums[i] > nums[i + 1]:   # 从小到大排,每次将最大值放到末尾
                        nums[i], nums[i + 1] = nums[i + 1], nums[i]
                if j > k-2:
                    return nums[-k] # 取第-k个即为第k个最大数