学习部分:
大跟堆图解
lc:
解答:
class Solution {
public:
void maxHeapfy(vector<int>& nums , int i , int heapSize){
int l = 2*i+1;
int r = 2*i+2;
int large = i ;
if(l< heapSize && nums[l] > nums[large]){
large = l;
}
if(r < heapSize && nums[r] > nums[large]){
large = r;
}
if( large != i){
swap(nums[i] , nums[large]);
maxHeapfy(nums, large , heapSize); //防止动了一个父节点,对挂在这个父节点下面的子节点有影响
}
}
void buildMaxHeap(vector<int>& nums , int heapSize){
for(int i = heapSize/2 ; i>=0 ; i --){//从叶节点修改
maxHeapfy( nums , i , heapSize);
}
}
int findKthLargest(vector<int>& nums, int k) {
int heapSize = nums.size() ;
buildMaxHeap(nums,heapSize);
for(int i = nums.size()-1 ; i >=nums.size()- k +1 ;--i){//一定得是nums.size(),不能用heapSize,用nums.size(),是相当于我一直在直接用数组的实际长度,只不过后面几个比较大的值被“锁”起来不用了。如果用heapSize,它的值在下面一直变化,会报错。
swap(nums[0] , nums[i]);
heapSize--;
maxHeapfy(nums , 0 , heapSize);
}
return nums[0];
}
};