LeetCode 215. Kth Largest Element in an Array

简介: 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

Description



Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.


Example 1:

Input: [3,2,1,5,6,4] and k = 2

Output: 5


Example 2:

Input: [3,2,3,1,2,4,5,5,6] and k = 4

Output: 4


描述



在未排序的数组中找到第 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大元素的左边,我们就对当前元素右边的元素进行排序;如果当前元素在第k大元素的右边,我们就对当前元素左边的元素进行排序,直到找到第K的元素为止.


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-01-23 22:57:06
# @Last Modified by:   何睿
# @Last Modified time: 2019-01-26 20:23:38
class Solution:
    def findKthLargest(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        left, right = 0, len(nums) - 1
        # 
        pivot = self._quicksort(nums, left, right)
        while pivot != k - 1:
            # 如果当前确定的位置在k的左边,说明要求的元素应该在右边
            if pivot < k - 1:
                left = pivot + 1
            # 如果当前确定的位置在k的右边,说明要求的元素应该在左边
            elif pivot > k - 1:
                right = pivot - 1
            pivot = self._quicksort(nums, left, right)
        return nums[pivot]
    # 快速排序
    def _quicksort(self, nums, left, right):
        pivot, j = right, left
        for i in range(left, right):
            if nums[i] > nums[pivot]:
                if j != i:
                    nums[i], nums[j] = nums[j], nums[i]
                j += 1
        nums[j], nums[pivot] = nums[pivot], nums[j]
        # 返回当前已经确定元素的索引
        return j


源代码文件在这里.

目录
相关文章
|
5月前
|
Java
java lab8--------7-2 sdut-JAVA-Insert Integer element into array lists
java lab8--------7-2 sdut-JAVA-Insert Integer element into array lists
30 0
Leetcode 230. Kth Smallest Element in a BST
先来看下二叉搜索树的性质,对于任意一个非叶子节点,它的左子树中所有的值必定小于这个节点的val,右子树中所有的值必定大于或等于当前节点的val。 这条性质就保证了如果我们对二叉搜索树做中序遍历,中序遍历的结果肯定是有序的。对于此题而言,我们只需要拿到中序遍历结果,然后返回第k个即可,时间复杂度是O(n)。
66 1
|
算法 Python
LeetCode 410. Split Array Largest Sum
给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。
148 0
LeetCode 410. Split Array Largest Sum
|
Python
LeetCode 378. Kth S Element in a Sorted Matrix
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。 请注意,它是排序后的第k小元素,而不是第k个元素。
114 0
LeetCode 378. Kth S Element in a Sorted Matrix
|
算法
LeetCode 229. Majority Element II
给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。
92 0
LeetCode 229. Majority Element II
|
索引
LeetCode 162. Find Peak Element
给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。 数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。
106 0
LeetCode 162. Find Peak Element
|
Python
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or
489 0
|
算法 Python
LeetCode 169. 多数元素 Majority Element
LeetCode 169. 多数元素 Majority Element
|
人工智能 C++ Python
LeetCode 961. N-Repeated Element in Size 2N Array
LeetCode 961. N-Repeated Element in Size 2N Array
194 0
成功解决ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or
成功解决ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or