LeetCode215:数组中第K个最大元素
生活随笔
收集整理的這篇文章主要介紹了
LeetCode215:数组中第K个最大元素
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在未排序的數組中找到第 k 個最大的元素。請注意,你需要找的是數組排序后的第 k 個最大的元素,而不是第 k 個不同的元素。
示例:輸入: [3,2,1,5,6,4] 和 k = 2
輸出: 5
這個問題就是一個排序問題,下面嘗試使用不同的排序方法來實現。
快速排序
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版本的一點微小改動。
堆排序
下面介紹一種堆排序的辦法。事實上,在這個問題中,使用堆排序要效果更好。因為要輸出倒數到k大個數,在使用堆排序的時候,如果我們構建的是最大堆,那么就會從最大值依次排序輸出,而我們之前介紹的快排,一定要排好序之后才能找到倒數第k大個數,因此在這個問題中,相比于快排,堆排序效率更高。
在Python中,有一個包叫heapq,就可以幫我們建立堆這個數據結構。因此,我們使用這個包來實現堆排序就簡單多了。
heapq介紹
但是這個heapq默認是構建最小堆,而不是最大堆。我們這里要輸出倒數第k大個數。做法很簡單。我們構建堆的時候,把數字顛倒過來。最大的數變成最小的數,這樣堆排序按照最小堆輸出的時候,再添加一個負號,實際上又顛倒過來了,這樣就相當于按照最大堆來輸出了。下面是代碼:
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) 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的LeetCode215:数组中第K个最大元素的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何生成HDF5文件
- 下一篇: 抽象基类和纯虚函数