classSolution { public: intfindKthLargest(vector<int>& nums, int k){ int len = nums.size(); returnQuickChoose(nums, len - k, 0, len - 1); } intQuickChoose(vector<int>& nums, int index, int left, int right) { if (left == right) return nums[left]; int i = left - 1; int j = right + 1; int numFlag = nums[left]; while (i < j) { do ++i; while (nums[i] < numFlag); do --j; while (nums[j] > numFlag); if (i < j) swap(nums[i], nums[j]); } if ( index <= j) returnQuickChoose(nums, index, left, j); elsereturnQuickChoose(nums, index, j + 1, right); } };
classSolution { public: intfindKthLargest(vector<int>& nums, int k){ int len = nums.size(), size = len; BuildHeap(nums, len); for (int i = len - 1; i > len - k; --i) { swap(nums[0], nums[i]); --size; Heapify(nums, size, 0); } return nums[0]; } voidBuildHeap(vector<int>& nums, int size) { for (int i = size / 2 - 1; i >= 0; --i) Heapify(nums, size, i); } voidHeapify(vector<int>& nums, int size, int cur) { int leftNode = cur * 2 + 1; int rightNode = cur * 2 + 2; int largest = cur; if (leftNode < size && nums[leftNode] > nums[largest]) largest = leftNode; if (rightNode < size && nums[rightNode] > nums[largest]) largest = rightNode; if (cur != largest) { swap(nums[largest], nums[cur]); Heapify(nums, size, largest); } } };