215. 数组中的第K个最大元素
1. 题目描述
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.代码如下
//冒泡排序
void swap(int *a,int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int findKthLargest(int* nums, int numsSize, int k) {
//冒泡排序
int i,j;
for(i = 0;i<numsSize;i++)
{
for(j=i+1;j<numsSize;j++)
{
if(nums[i] < nums[j])
{
swap(&nums[i],&nums[j]);
}
}
}
return nums[k-1];
}
//2021-04-19
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
map<int,int,greater<int>>mp;
for (auto n:nums)
{
mp[n]++;
}
int count = 0;
for (auto n = mp.begin(); n != mp.end();++n)
{
if (count + n->second >= k)
{
return n->first;
}
count += n->second;
}
return -1;
}
};
3. 借助快速排序的归并思想
借助快速排序的划分思想,每一趟划分,确定一个元素在数组中的有序的固定的位置。此时,若此位置就是题目要求的序号的元素,那么
直接返回即可。
如不是,如果此位置左边的元素的个数>=k,则此,那么要求的元素一定落在左边,否则就落在右边,按照这个规则最终可得到题目要求的元
素,此时返回即可。
int parttion(int *g,int left,int right)
{
int key = g[left];
while (left < right)
{
while (left < right && g[right] >= key)
{
right--;
}
g[left] = g[right];
while (left < right && g[left] <= key)
{
left++;
}
g[right] = g[left];
}
g[left] = key;
return left;
}
int findKthLargest(int* nums, int numsSize, int k){
int left = 0;
int right = numsSize -1;
int pivoit = parttion(nums,left,right);
int seq = numsSize - k+1;//搞清楚第k大和第k小的区别
while (seq-1 != pivoit)
{
printf("%d ",pivoit);
if (pivoit <= seq -1)
{
left = pivoit+1;
pivoit = parttion(nums,left,right);
}
else
{
right = pivoit-1;
pivoit = parttion(nums,left,right);
}
}
return nums[seq-1];
}