基于堆排序(内存足够存放所有数据)
堆排序的初始建堆操作时间复杂度为O(N)(可证,通过级数),之后每加入新元素或者取走堆顶元素的时间复杂度为O(logN),所以堆排序的时间复杂度为O (NlogN) 。
因为每次取堆顶的元素都是最大/最小的,这里建大顶堆的话,取到第K大的元素时间复杂度为O(N+KlogN) 。
class Solution{
public:
void AdjustHeap(vector<int>& nums, int i, int n){
// nums[0] 是堆顶,堆中共有n个元素,现在调整 i
int root = i, j = root * 2 + 1;
while(j < n){
if(j + 1 < n && nums[j + 1] > nums[j]) // 对比左右子节点的大小
j++;
if(nums[root] < nums[j]){
swap(nums[root], nums[j]);
root = j;
j = root * 2 + 1;
}
else
break;
}
}
int findKthLargest(vector<int>& nums, int k){
if(k > nums.size())
return 0;
// 初始化大顶堆
for(int i = n