题目描述
知识点
堆排序
结果
我感觉挺好的啦,都在要求范围之内了啦~~~我不贪多惹。
实现
码前思考
- 就是简单的排序题,为什么这里要用堆排序呢?
因为堆排序要快一些,另外这里是寻找k
大,所以用归并排序多余了; - 其实也可以用快速排序的;
- 这里的数组下标是从0开始的,与《算法笔记》上的不太一样,需要注意!
代码实现
//首先这是一道排序的题目
//排序有很多种排序算法
//这里选择堆排序,因为这里要求第k个元素啊
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
createHeap(nums);
int res;
int endidx = nums.size()-1;
for(int i=0;i<k;i++){
res = nums[0];
nums[0] = nums[endidx--];
downAdjust(nums,0,endidx);
}
return res;
}
//注意传地址,不然会有问题的
void createHeap(vector<int>& nums){
int endidx = nums.size()-1;
for(int i=(endidx-1)/2;i>=0;i--){
downAdjust(nums,i,endidx);
}
}
//向下调整操作
void downAdjust(vector<int>& nums,int low,int high){
int i = low;
int j = (i*2)+1;
while(j <= high){//存在左节点
if(j+1 <= high && nums[j+1] > nums[j]){//存在右结点
j = j+1;
}
if(nums[i] < nums[j]){
swap(nums[i],nums[j]);
i = j;
j = (i*2)+1;
}else{
break;
}
}
}
};
码后反思
- 背代码是不可能背的,主要还是不断地去看,掌握算法的思想才是最重要的。💪
二刷代码
这次学乖了,知道了使用priority_queue
来解题~这个题目也是面试经常问的!
//采用堆来求解,或者也可以使用分块的思想,分块好像要快一点
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
//使用的是小根堆
priority_queue<int,vector<int>,greater<int>> q;
for(int i=0;i<k;i++){
q.push(nums[i]);
}
//接下来进行很多次的操作
for(int i=k;i<nums.size();i++){
int curTop = q.top();
if(curTop<nums[i]){
q.pop();
q.push(nums[i]);
}
}
return q.top();
}
};