题目
代码(8.22 首刷自解)
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
priority_queue<int> q;
for(int& i : nums) {
q.push(i);
}
for(int i = 0; i < k-1; i++) {
q.pop();
}
return q.top();
}
};
Quick Select 快速选择排序
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
int n = nums.size();
return quickSort(nums, 0, n-1, n-k);
}
int quickSort(vector<int>& nums, int start, int end, int target) {
if(start == end)
return nums[target];
int pivot = nums[rand()%(end-start+1)+start];
int i = start-1, j = end+1;
while(i < j) {
while(nums[++i] < pivot);
while(nums[--j] > pivot);
if(i < j) swap(nums[i], nums[j]);
}
if(j >= target) return quickSort(nums, start, j, target);
return quickSort(nums, j+1, end, target);
}
};
代码(9.4 二刷自解)
手撕大根堆
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
buildHeap(nums);
int n = nums.size()-1;
for(int i = 0; i < k-1; i++) {
swap(nums[0], nums[n-i]);
heapAdjust(nums, 0, n-i-1);
}
return nums[0];
}
void buildHeap(vector<int>& nums) {
int n = nums.size()-1;
for(int i = (n-1)/2; i >= 0; i--) {
heapAdjust(nums, i, n);
}
}
void heapAdjust(vector<int>& nums, int k, int n) {
for(int i = 2*k+1; i <= n; i = i*2+1) {
if(i+1 <= n && nums[i+1] > nums[i]) {
i++;
}
if(nums[k] < nums[i]) {
swap(nums[k], nums[i]);
k = i;
} else {
return;
}
}
}
};