Leetcode 215. 数组中的第K个最大元素 快速排序 / 堆排序
原题链接:Leetcode 215. 数组中的第K个最大元素
快速排序1——超时:
class Solution {
public:int quicksort(vector<int>& nums,int l,int r,int k){int n=nums.size();int flag = nums[l];int i=l,j=r;while(i<=j){while(i<=j && nums[i]<=flag) i++;while(i<=j && nums[j]>flag) j--;if(i<=j) {swap(nums[i],nums[j]);i++;j--;}}swap(nums[l],nums[j]);if(j<n-k) return quicksort(nums,j+1,r,k);if(j>n-k) return quicksort(nums,l,j-1,k);return nums[j];}int findKthLargest(vector<int>& nums, int k) {int n=nums.size();return quicksort(nums,0,n-1,k);}
};
快速排序2——官解:
class Solution {
public:int quicksort(vector<int>& nums,int l,int r,int k){if(l==r) return nums[k];int flag = nums[l];int i=l-1,j=r+1;while(i<j){do i++; while(nums[i]<flag) ;do j--; while(nums[j]>flag) ;if(i<j) {swap(nums[i],nums[j]);}}if(k<=j) return quicksort(nums,l,j,k);else return quicksort(nums,j+1,r,k);}int findKthLargest(vector<int>& nums, int k) {int n=nums.size();return quicksort(nums,0,n-1,n-k);}
};
快速排序3:
参考 215. 数组中的第 K 个最大元素(分治,清晰图解)
class Solution {
public:int quicksort(vector<int>& nums,int k){int pivot = nums[ rand() % nums.size()];vector<int> big, equal, small;for(auto x: nums){if(x > pivot) big.push_back(x);else if( x < pivot ) small.push_back(x);else equal.push_back(x);}if(k <= big.size()) return quicksort(big,k);if( nums.size() - small.size() < k ) return quicksort(small, k - (nums.size()-small.size()) );return pivot;}int findKthLargest(vector<int>& nums, int k) {return quicksort(nums,k);}
};
堆排序:
建立一个大根堆,做 k−1 次删除操作后堆顶元素就是要找的答案,可用优先队列实现,或者自己实现堆排序:
- 优先队列:
class Solution {
public:int findKthLargest(vector<int>& nums, int k) {priority_queue<int> q;for(auto x: nums) q.push(x);while(--k) q.pop();return q.top();}
};
- 堆排序
参考:【数据结构】非线性数据结构——堆
class Solution {
public:void heapify(vector<int>& nums,int n,int i){int largeset = i;int left = 2 * i +1;int right = 2 * i +2;if(left<n && nums[left]>nums[largeset]) largeset = left;if(right<n && nums[right]>nums[largeset]) largeset = right;if(largeset!=i){swap(nums[i],nums[largeset]);heapify(nums,n,largeset);}}void heapSort(vector<int>& nums){int n= nums.size();for(int i= n/2-1;i>=0;i--){heapify(nums,n,i);}for(int i = n-1;i>0 ;i--){swap(nums[0],nums[i]);heapify(nums,i,0);}}int findKthLargest(vector<int>& nums, int k) {heapSort(nums);int n = nums.size();return nums[n-k];}
};