classSolution { public: intfindKthLargest(vector<int>& nums, int k){ int n = nums.size(); buildHeap(nums, n); for (int i = 1; i <= k; ++i) { swap(nums[0], nums[n - i]); heapAdjust(nums, 0, n - i); } return nums[n - k]; } voidbuildHeap(vector<int> &nums, int n) { for (int i = n / 2 - 1; i >= 0; --i) { heapAdjust(nums, i, n); } } voidheapAdjust(vector<int> &nums, int k, int n) { int i = left(k); while (i < n) { if (i + 1 < n && nums[i + 1] > nums[i])++i; if (nums[k] >= nums[i]) break; swap(nums[k], nums[i]); k = i; i = left(k); } } intleft(int i){ return2 * i + 1; } };
// c++标准库算法实现 classSolution { public: intfindKthLargest(vector<int>& nums, int k){ int n = nums.size(); make_heap(nums.begin(), nums.end()); for (int i = 0; i < k; ++i) { pop_heap(nums.begin(), nums.end() - i); } return nums[n - k]; } };