关于leetcode第K个最大元素的几种解法

Posted 我的_笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于leetcode第K个最大元素的几种解法相关的知识,希望对你有一定的参考价值。

  对于这一题我使用了最大堆,快速排序,归并排序几种解法来做这一题,速度最快的是归并排序

使用定值的最小堆每次更新数组最后剩下前k个最大元素,而且堆顶就是我们要的第K个元素。

堆排序:

import heapq
class Solution(object):
    def findKthLargest(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        self.min_heap = []
        self.capacity = k
        self.nums = nums
        return self.get_k()
    def push(self, val):
        if len(self.min_heap) >= self.capacity:
            if self.min_heap[0]  < val:
                heapq.heapreplace(self.min_heap, val)
        else:
            heapq.heappush(self.min_heap, val)
    def get_k(self):
        for val in self.nums:
            self.push(val)
        return self.min_heap[0]

 

快速排序:

class Solution(object):
    def findKthLargest(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        return nums[-k]

def fast_sort(self, nums):
        if len(nums)<2:
            return nums
        else:
            pivote = nums[0]
            l = [i for i in nums[1:] if i <=pivote]
            r = [i for i in nums[1:] if i > pivote]
            return self.fast_sort(l) + [pivote] + self.fast_sort(r)

时间是5052ms慢的吓人?

归并排序:

class Solution(object):
    def findKthLargest(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        return self.merge_sort(nums)[-k]

 def merge_sort(self, nums):
        if len(nums) < 2:
            return nums
        else:
            mid = len(nums) // 2
            return self.sort_nums(self.merge_sort(nums[:mid]), self.merge_sort(nums[mid:]))
    
    def sort_nums(self, left, right):
        i, j = 0, 0
        s = []
        l_len, r_len = len(left), len(right)
        while i < l_len and j < r_len:
            if left[i] < right[j]:
                s.append(left[i])
                i += 1
            else:
                s.append(right[j])
                j += 1
        if i < l_len:
            s += left[i:]
        else:
            s += right[j:]
        return s

这个也是我自己实现的归并排序时间是 88ms

最后用Python自带的排序来做

class Solution(object):
    def findKthLargest(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        nums.sort()
        return nums[-k]

时间是28ms听说Python排序底层也是用的归并排序只不过使用C语言实现的所以快很多

 

以上是关于关于leetcode第K个最大元素的几种解法的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode.215-数组中的第K个最大元素

Leetcode 215. 数组中的第K个最大元素

LeetCode215. 数组中的第K个最大元素

LeetCode215. 数组中的第K个最大元素

leetcode215. Kth Largest Element in an Array

最大子数组问题的几种解法