目录
题目描述
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]
这篇博客介绍了如何在给定整数数组中找到第k大的元素,要求在O(n)的时间复杂度内完成。两种解法分别是使用堆(小顶堆)和快速选择算法。堆法通过维护一个大小为k的小顶堆,逐步替换堆顶元素;快排法则利用快速选择的思想,通过一次划分找到正确位置并递归处理。
880

被折叠的 条评论
为什么被折叠?



