题目描述
给定整数数组 nums
和整数 k
,请返回数组中第 **k**
个最大的元素。
请注意,你需要找的是数组排序后的第 k
个最大的元素,而不是第 k
个不同的元素。
你必须设计并实现时间复杂度为 O(n)
的算法解决此问题。
示例 1:
输入: [3,2,1,5,6,4], k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4
提示:
1 <= k <= nums.length <= 105
-104 <= nums[i] <= 104
解答
分析
使用快排的 partition
方法,每次使用后得到枢轴pivot
的最终位置文章来源:https://www.toymoban.com/news/detail-680793.html
文章来源地址https://www.toymoban.com/news/detail-680793.html
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
// 利用快排中的 partition 优化
int len = nums.size();
int left = 0, right = len - 1;
// 第k大元素下标,就是快排后第len - k 位置的元素
int target = len - k;
while(true)
{
int index = partition(nums, left, right);
if(index == target)
{
return nums[index];
}
else if(index < target)
{
left = index + 1;
}
else
{
right = index - 1;
}
}
}
int partition(vector<int>& nums, int left, int right)
{
int pivot = nums[left];
int j = left;
// 同向移动的双指针快排
// i是右指针
for(int i = left + 1; i <= right; ++i)
{
// nums[i]不满足 小于pivot的条件时,i移动到满足条件的位置时再进行和nums[j]交换
if(nums[i] < pivot)
{
j++; // 左指针右移
swap(nums, j, i);
}
}
swap(nums, j, left);
return j;
}
void swap(vector<int>& nums, int i, int j)
{
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
};
到了这里,关于215. 数组中的第K个最大元素的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!