我是靠谱客的博主 高贵短靴,最近开发中收集的这篇文章主要介绍LeetCode 215. 数组中的第K个最大元素,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Description

在未排序的数组中找到第 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 ≤ 数组的长度。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

Solution 1 全排序

对整个数组排序取前K个元素。时间O(nlogn)

Solution 2 部分排序

使用冒泡,冒k次泡能把前k大元素提取出来排好序。O(k*n)

Solution 3 堆排序

维护一个容量为K的小根堆(不能用大根堆),最终得到没有排好序的K大元素。O(nlogk)

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        import heapq
        minHeap = [float('-inf') for _ in range(k)]
        for n in nums:
            if n > minHeap[0]:
                heapq.heappop(minHeap)
                heapq.heappush(minHeap, n)
        return minHeap[0]

Solution 4 快排思想

时间O(n)。

class Solution:
    def findKthLargest(self, nums, k: int) -> int:
        def findK(left, right, k):
            mid = partition(left, right)
            print(mid)
            while mid != k:
                if mid < k:
                    mid = partition(mid+1, right)
                elif mid > k-1:
                    mid = partition(left, mid-1)
            return nums[k]

		# partition返回正确数字的index
        def partition(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
        # 第k大元素在数组的位置为len(nums)-k
        ans = findK(0, len(nums)-1, len(nums)-k)
        return ans

最后

以上就是高贵短靴为你收集整理的LeetCode 215. 数组中的第K个最大元素的全部内容,希望文章能够帮你解决LeetCode 215. 数组中的第K个最大元素所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部