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

链接

https://leetcode-cn.com/problems/kth-largest-element-in-an-array

思路

使用类似快排的思想:

1、随机选择一个数字后,分解成排序的2部分,返回随机数所在位置

2、根据随机数所在位置,循环分区,直到成功获取。

import random

class Solution(object):
    def findKthLargest(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        left = 0
        right = len(nums) -1 
        k = k-1
        pos = self.partion(nums, k, left, right)
        while pos != k:
            if pos > k:
                right = pos
                pos = self.partion(nums, k, left, right-1)
            elif pos < k:
                left = pos
                pos = self.partion(nums, k-(left+1), left+1, right)
        return nums[k]


    def partion(self, a, k, left, right):
        """
        降序排列
        """
        pos = random.randint(left, right) 
        a[pos], a[right] = a[right], a[pos]
        i, j = left, left
        while j < right:
            if a[j] >= a[right]:
                a[i], a[j] = a[j], a[i]
                i = i + 1
            j = j + 1
        a[i], a[right] = a[right], a[i]
        return i

   转载规则


《215数组中的第K个最大元素》 wangyixin-tom 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
53最大自序和 53最大自序和
描述给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例 1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的
2021-06-05
下一篇 
121买卖股票最佳时机 121买卖股票最佳时机
描述给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可
2021-06-03
  目录