215. 数组中的第K个最大元素(快排,堆排序)
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
class Solution { public: int findKthLargest(vector<int>& nums, int k) { int left = 0, right = nums.size() - 1; while (true) { int idx = partition(nums, left, right); if (idx == k - 1) { return nums[idx]; } if (idx < k - 1) { left = idx + 1; } else { right = idx - 1; } } return 0; } int partition(vector<int>& nums, int left, int right) { int pivot = nums[left], i = left + 1, j = right; while (i <= j) { if (nums[i] < pivot && pivot < nums[j] ) { swap(nums[i++], nums[j--]); } if (nums[i] >= pivot) { i++; } if (pivot >= nums[j]) { j--; } } swap(nums[left], nums[j]); return j; } };
class Solution { public: int findKthLargest(vector<int>& nums, int k) { buildMaxHeap(nums); for (int i = 0; i < k - 1; i++) { swap(nums[0], nums[--heapSize]); maxHeapify(nums, 0); } return nums[0]; } private: int heapSize; int left(int i) { return (i << 1) + 1; } int right(int i) { return (i << 1) + 2; } void maxHeapify(vector<int>& nums, int i) { int largest = i, l = left(i), r = right(i); if (l < heapSize && nums[l] > nums[largest]) { largest = l; } if (r < heapSize && nums[r] > nums[largest]) { largest = r; } if (largest != i) { swap(nums[i], nums[largest]); maxHeapify(nums, largest); } } void buildMaxHeap(vector<int>& nums) { heapSize = nums.size(); for (int i = (heapSize >> 1) - 1; i >= 0; i--) { maxHeapify(nums, i); } } };