数组中的第K个最大元素。
该算法解法很多,最简单的就是排序,然后取matrix[k]。
2.还有就是快速排序
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
int lo = 0, hi = nums.size();
while (lo < hi)
{
int pre = lo + 1;
for (int suc = pre; suc < hi; suc++)
{
if (nums[lo] < nums[suc])swap(nums[pre++], nums[suc]);
}
swap(nums[lo], nums[pre - 1]);
if (pre == k)return nums[pre - 1];
else if (pre > k)hi = pre;
else lo = pre;
}
return -1;
}
};
3.我个人比较喜欢堆,因为堆很炫酷。
采用一个大小为k的小顶堆,n-k的大顶堆,任意的将数组的元素放进去。
本身是想用这个算法的,但是建堆的话要用priority_queue,这样会耗费很多内存o(n),时间也是o(logn),用该方法已经可以将数组排序!
这时候就要考虑原地建堆的方式来建立大顶堆和小顶堆了。
头文件#include ,STL在<algorithm.h>中实现了对存储在数组或vector中的元素进行堆操作的函数,包括make_heap, pop_heap, push_heap, sort_heap。
【两层:上层heap,底层vector(或数组)】,即用数组或vector数据容器来实现堆。
默认情况下是max-heap,该大顶堆实际上是以一个vector表现的完全二叉树。
make_heap( ):建立堆(要么大顶堆,要么小顶堆)
push_heap( ): 在堆中添加元素
pop_heap( ): 在堆中删除元素
sort_heap( ): 堆排序
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
make_heap(nums.begin(), nums.begin() + k, greater<int>());//1-k建立小顶堆
make_heap(nums.begin() + k, nums.end());//k+1到end建立大顶堆
if (k == nums.size())return nums[0];
while (nums[0] < nums[k])
{
pop_heap(nums.begin(), nums.begin() + k,greater<int>());
pop_heap(nums.begin() + k, nums.end());
swap(nums[k - 1], nums.back());
push_heap(nums.begin(), nums.begin() + k, greater<int>());
push_heap(nums.begin() + k, nums.end());
}
return nums[0];
};