可以使用快速选择算法来解决这个问题,该算法是快速排序的变形。快速选择算法的基本思想是,选取一个枢轴元素,将序列中小于枢轴的元素移到左边,大于枢轴的元素移到右边,然后判断枢轴的位置和第k大的位置的大小关系,如果相等则返回枢轴元素,否则根据枢轴位置和k的大小关系缩小搜索范围。具体实现如下:

def findKthLargest(nums, k):
    """
    :type nums: List[int]
    :type k: int
    :rtype: int
    """
    n = len(nums)
    left, right = 0, n - 1
    while True:
        pos = partition(nums, left, right)
        if pos == k - 1:
            return nums[pos]
        elif pos > k - 1:
            right = pos - 1
        else:
            left = pos + 1

def partition(nums, left, right):
    pivot = nums[left]
    while left < right:
        while left < right and nums[right] <= pivot:
            right -= 1
        nums[left] = nums[right]
        while left < right and nums[left] >= pivot:
            left += 1
        nums[right] = nums[left]
    nums[left] = pivot
    return left

其中,findKthLargest函数用于查找第k大的数,partition函数用于实现快速选择算法中的分区操作。时间复杂度为O(n),空间复杂度为O(1)

在未排序的序列中找到第k个最大的元素即倒数第k个数。输入 3 2 1 5 6 4 和 k=2输出:5用python实现不要先排序再提取。要求实现线性时间算法。

原文地址: http://www.cveoy.top/t/topic/dyqA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录