《LeetCode之每日一题》:97.数组中的第K个最大元素
Posted 是七喜呀!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:97.数组中的第K个最大元素相关的知识,希望对你有一定的参考价值。
题目链接: 数组中的第K个最大元素
有关题目
给定整数数组 nums 和整数 k,请返回数组中第 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
提示:
1 <= k <= nums.length <= 10^4
-10^4 <= nums[i] <= 10^4
题解
法一:排序
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
return sort(nums.begin(), nums.end(), greater<int>()), nums[k - 1];
}
};
时间复杂度:O(nlogn)
空间复杂度:O(logn),递归使用栈空间的空间代价的期望为O(logn)
补充:greater()与less())使用方法
#include<iostream>
#include<algorithm>//因为用了sort()函数
#include<functional>//因为用了greater<int>()
using namespace std;
void main()
{
int a[]={3,1,4,2,5};
int i;
int len=sizeof(a)/sizeof(int);//这里切记要除以sizeof(int)!
sort(a ,a + len, greater<int>());//内置类型的由大到小排序
for(i=0;i<len;i++)
cout<<a[i]<<" ";
cout<<"\\n";
sort(a, a + len, less<int>()); //内置类型的由小到大排序
for(i=0;i<len;i++)
cout<<a[i]<<" ";
}
方法二:基于堆排序的选择方法
思路:
建立大根堆,做k - 1次删除操作后堆顶元素就是我们要找的答案
//调整
void maxHeapify(int* a, int i, int heapSize)
{
int l = i * 2 + 1, r = i * 2 + 2, largest = i;//当根节点索引为0,对应的左右孩子节点
if (l < heapSize && a[l] > a[largest])
largest = l;
if (r < heapSize && a[r] > a[largest])
largest = r;
if (largest != i)
{
int t = a[i];
a[i] = a[largest],a[largest] = t;//交换
maxHeapify(a, largest, heapSize);//递归继续调整
}
}
//建堆
void buildMaxHeap(int* a, int heapSize)
{
for (int i = heapSize / 2; i >= 0; --i)//从最大的非叶子节点开始(len/2),到根节点终止
{
maxHeapify(a, i, heapSize);
}
}
int findKthLargest(int* nums, int numsSize, int k){
int heapSize = numsSize;//堆的大小
buildMaxHeap(nums, heapSize);
//删除,首位元素交换
for (int i = numsSize - 1; i >= numsSize - k + 1; --i)//总共执行k - 1次
{
int t = nums[0];
nums[0] = nums[i], nums[i] = t;//交换
--heapSize;
maxHeapify(nums, 0, heapSize);//调整
}
return nums[0];
}
以上是关于《LeetCode之每日一题》:97.数组中的第K个最大元素的主要内容,如果未能解决你的问题,请参考以下文章
《LeetCode之每日一题》:90.在排序数组中查找元素的第一个和最后一个位置