LeetCode215:数组中第K个最大元素
在未排序的數(shù)組中找到第 k 個最大的元素。請注意,你需要找的是數(shù)組排序后的第 k 個最大的元素,而不是第 k 個不同的元素。
示例:輸入: [3,2,1,5,6,4] 和 k = 2
輸出: 5
這個問題就是一個排序問題,下面嘗試使用不同的排序方法來實現(xiàn)。
快速排序
class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:self.quickSortHelper(nums, 0, len(nums) - 1)return nums[-k]def quickSortHelper(self, nums, first, last):if first < last:splitPoint = self.partition(nums, first, last)self.quickSortHelper(nums, first, splitPoint - 1)self.quickSortHelper(nums, splitPoint + 1, last)def partition(self, nums, first, last):leftmark = firstrightmark = lastbase = nums[first]while leftmark < rightmark:if nums[leftmark] <= base:leftmark += 1if nums[rightmark] >= base:rightmark -= 1else:nums[leftmark], nums[rightmark] = nums[rightmark], nums[leftmark]nums[rightmark], nums[first] = nums[first], nums[rightmark]return rightmark思路就是《劍指offer》中的Partition版本的一點微小改動。
堆排序
下面介紹一種堆排序的辦法。事實上,在這個問題中,使用堆排序要效果更好。因為要輸出倒數(shù)到k大個數(shù),在使用堆排序的時候,如果我們構(gòu)建的是最大堆,那么就會從最大值依次排序輸出,而我們之前介紹的快排,一定要排好序之后才能找到倒數(shù)第k大個數(shù),因此在這個問題中,相比于快排,堆排序效率更高。
在Python中,有一個包叫heapq,就可以幫我們建立堆這個數(shù)據(jù)結(jié)構(gòu)。因此,我們使用這個包來實現(xiàn)堆排序就簡單多了。
heapq介紹
但是這個heapq默認(rèn)是構(gòu)建最小堆,而不是最大堆。我們這里要輸出倒數(shù)第k大個數(shù)。做法很簡單。我們構(gòu)建堆的時候,把數(shù)字顛倒過來。最大的數(shù)變成最小的數(shù),這樣堆排序按照最小堆輸出的時候,再添加一個負(fù)號,實際上又顛倒過來了,這樣就相當(dāng)于按照最大堆來輸出了。下面是代碼:
class Solution(object):def findKthLargest(self, nums, k):""":type nums: List[int]:type k: int:rtype: int"""from heapq import heappush, heappoph = []for i in nums:heappush(h, -i)for i in range(0, k-1):heappop(h)return -heappop(h)a = Solution() nums = [1, 2,4,5, 3] a.findKthLargest(nums, 2) 《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的LeetCode215:数组中第K个最大元素的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何生成HDF5文件
- 下一篇: 抽象基类和纯虚函数