215. Kth Largest Element in an Array[堆|快排]
目录
题目描述
解法1:堆
解法2:快排
题目描述
Given an integer array nums
and an integer k
, return the kth
largest element in the array.
Note that it is the kth
largest element in the sorted order, not the kth
distinct element.
You must solve it in O(n)
time complexity.
Example 1:
Input: nums = [3,2,1,5,6,4], k = 2 Output: 5
Example 2:
Input: nums = [3,2,3,1,2,4,5,5,6], k = 4 Output: 4
Constraints:
1 <= k <= nums.length <= 105
-104 <= nums[i] <= 104
解法1:堆
维护一个大小为K的小顶堆
python:
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
import heapq as hq
heap = nums[:k]
hq.heapify(heap)
for t in nums[k:]:
if t > heap[0]:
hq.heapreplace(heap, t)
return heap[0]
c++:
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
priority_queue<int> q(nums.begin(), nums.end());
for (int i = 0; i < k - 1; i++) {
q.pop();
}
return q.top();
}
};
解法2:快排
快排思想是根据某值将数组分成两部分,左边的均小于该数,右边的均大于该数
这里可以按照从大到小排序,找到应该放在第k-1位置的数即可
python:
class Solution:
def partition(self, nums, l, r, k):
if l >= r:
return
cur = nums[l]
i = l
j = r
while l < r:
while l < r and cur > nums[r]:
r -= 1
if l < r:
nums[l] = nums[r]
l += 1
while l < r and nums[l] > cur:
l += 1
if l < r:
nums[r] = nums[l]
r -= 1
nums[l] = cur
if l == k-1:
return
elif l < k-1:
self.partition(nums, l + 1, j, k)
else:
self.partition(nums, i, l - 1, k)
def findKthLargest(self, nums: List[int], k: int) -> int:
self.partition(nums, 0, len(nums) - 1, k)
return nums[k-1]