堆排序
建堆后,弹出k-1个数,堆顶的就是第k大的数。
class Solution {public:void maxHeapDown(vector<int>& nums,int father,int heapSize){int l = father*2+1;int r = father*2+2;int largest = father;if(l<heapSize&&nums[l]>nums[largest]){largest = l;}if(r<heapSize&&nums[r]>nums[largest]){largest = r;}if(father!=largest){swap(nums[father],nums[largest]);maxHeapDown(nums,largest,heapSize);}}void buildHeap(vector<int>& nums){for(int i=nums.size()/2;i>=0;i--){maxHeapDown(nums,i,nums.size());}}int findKthLargest(vector<int>& nums, int k) {buildHeap(nums);int size = nums.size();for(int i=0;i<k-1;i++){swap(nums[0],nums[size-1]);size--;maxHeapDown(nums,0,size);}return nums[0];}};
快速排序
快速排序找第k大。
class Solution {public:int partition(vector<int>& nums,int l,int r){int x = nums[r];int i = l;for(int j=l;j<r;j++){if(nums[j]<x){swap(nums[i++],nums[j]);}}swap(nums[i],nums[r]);return i;}int quickSelect(vector<int>& nums,int l,int r,int index){// index的出现保证了其肯定不会出现l>r的情况。int mid = partition(nums,l,r);if(mid==index){return nums[mid];} else if(mid<index){ //mid+1<=index<=rreturn quickSelect(nums,mid+1,r,index);} else{ //mid-1>=index>=lreturn quickSelect(nums,l,mid-1,index);}}int findKthLargest(vector<int>& nums, int k) {int n = nums.size();return quickSelect(nums,0,n-1,n-k);}};
