leetcode 215 找第k大的元素(线性期望时间选择问题)
其实线性期望时间的选择问题就是使用快速排序的方法,不过相较于快速排序需要对枢纽值两边进行递归,找第k大元素只需要对枢纽值的一边进行递归;
因此其平均时间复杂度为O(N)=N+N/2+N/4+...<2N,不过该方法的最坏情况的时间复杂度为O(N^2)。
void swap(vector<int> &nums,int i,int j) { int tmp=nums[i]; nums[i]=nums[j]; nums[j]=tmp; } int findMedia(vector<int> &nums,int l,int r) { int cen=(l+r)/2; if(nums[cen]<nums[l]) { swap(nums,cen,l); } if(nums[r]<nums[l]) swap(nums,l,r); if(nums[r]<nums[cen]) swap(nums,cen,r); swap(nums,cen,r-1); return nums[r-1]; } int quicksort(vector<int> &nums,int l,int r) { int m=findMedia(nums,l,r); int i=l,j=r-1; if(i==j) return l; for(;;) { while(nums[++i]<m); while(nums[--j]>m); if(i<j) swap(nums,i,j); else break; } swap(nums,i,r-1); return i; } int findKthLargest(vector<int>& nums, int k) { int len=nums.size(); if(len==1) return nums[0]; k=len-k+1; int l=0,r=len-1; while(l<r) { int m=quicksort(nums,l,r); if(m+1==k) return nums[m]; else if(m+1>k) { r=m-1; } else { l=m+1; } } return nums[l]; }
posted on 2020-02-29 22:33 QingFengDaHui 阅读(179) 评论(0) 编辑 收藏 举报