关于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个最大元素的几种解法的主要内容,如果未能解决你的问题,请参考以下文章