leetcode215 - 数组中的第K个最大元素
面试中频率最高题目之一
题目描述
给定整数数组
n
u
m
s
nums
nums 和整数
k
k
k,请返回数组中第
k
k
k 个最大的元素。
请注意,你需要找的是数组排序后的第
k
k
k 个最大的元素,而不是第
k
k
k 个不同的元素。
示例 1:
Input: [3,2,1,5,6,4] 和 k = 2
Output: 5
示例 2:
Input: [3,2,3,1,2,4,5,5,6] 和 k = 4
Output: 4
题解
解法一
直接使用 v e c t o r vector vector 自带的 s o r t sort sort 函数
int findKthLargest(vector<int> &nums, int k)
{
sort(nums.begin(), nums.end());
return nums[numsSize - k];
}
时间复杂度为 O ( n . l o g n ) , 空 间 复 杂 度 为 O ( 1 ) O(n.logn),空间复杂度为O(1) O(n.logn),空间复杂度为O(1)
解法二
使用优先级队列中小顶堆
int findKthLargest(vector<int>& nums, int k)
{
//小顶堆
priority_queue<int, vector<int>, greater<int> > pq;
int sz = nums.size();
for(int i=0; i<k; ++i)
{
pq.push(nums[i]);
}
for(int i=k; i<sz; ++i)
{
if(nums[i] > pq.top())
{
pq.pop();
pq.push(nums[i]);
}
}
return pq.top();
}
时间复杂度为 O ( n . l o g k ) , 空 间 复 杂 度 为 O ( 1 ) O(n.logk),空间复杂度为O(1) O(n.logk),空间复杂度为O(1)
解法三
int findKthLargest(vector<int>& nums, int k)
{
int n = nums.size();
int l = 0, r = n-1;
while(true)
{
int i = l, j = r;
int pivot = l;
while(i < j)
{
//从后往前找,找到第一个小于基准数的元素序号
while(i < j && nums[j] >= nums[l]) --j;
//从前往后找,找到第一个大于基准数的元素序号
while(i < j && nums[i] <= nums[l]) ++i;
swap(nums[i], nums[j]);
}
swap(nums[i], nums[l]);//nums[l]应该处的位置在索引i处
if(i == n-k) return nums[i]; //若恰为倒数第k个的位置
else if(i > n - k) r = i - 1; //将查找范围放到该位置左侧
else l = i+1; //将查找范围放在该位置右侧
}
}
时间复杂度为 O ( n ) , 空 间 复 杂 度 为 O ( 1 ) O(n),空间复杂度为O(1) O(n),空间复杂度为O(1)