- Ideas
Cree un montón mínimo de longitud k en la matriz original y recorra la matriz secuencialmente desde la posición k hasta la matriz original. Cuando nums [i]> nums [0], ejecute swap (nums [i], nums [0]), y luego ajustar hacia abajo Después de atravesar la matriz, nums [0] es el K-ésimo elemento más grande en la matriz.
Complejidad de tiempo: O (n * logk)
Complejidad espacial: O (1)
- Código
class Solution {
public:
//建立最小堆
void buildMinHeap(vector<int>& nums, int k){
int temp;
for(int i = (k - 1)/2; i >= 0; --i){
adjustDown(nums, i, k);
}
}
//向下调整
void adjustDown(vector<int>& nums, int indexofdown,int k){
int index = indexofdown;
int temp;
while(index <= k - 1){
temp = index * 2 + 1;
if(temp + 1 <= k - 1 && nums[temp + 1] < nums[temp]){
temp = temp + 1;
}
if(temp <= k - 1 && nums[index] > nums[temp]){
swap(nums[index], nums[temp]);
index = temp;
}else{
break;
}
}
}
int findKthLargest(vector<int>& nums, int k) {
buildMinHeap(nums, k);
int size = nums.size();
for(int i = k; i < size; ++i){
if(nums[i] >= nums[0]){
swap(nums[i], nums[0]);
adjustDown(nums, 0, k);
}
}
return nums[0];
}
};