码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-03-10 21:09:24      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:int   end   color   etc   pivot   for   ret   最小堆   解法   

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

使用定值的最小堆每次更新数组最后剩下前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个最大元素的几种解法

标签:int   end   color   etc   pivot   for   ret   最小堆   解法   

原文地址:https://www.cnblogs.com/python-zkp/p/10506724.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!