题目
因为这题还和男朋友吵了一架,无语。肯定是平常没人吵架,就知道吵我吵我吵我吵我。呵呵呵呵呵呵呵额呵呵呵呵呵呵呵呵呵呵。看来不能留着过年了。
- 维护一个只有k个元素的小根堆,push的时候<=堆顶就直接不用push了。最后堆顶就是第K大。
class Solution {
private:
int *heap,k,sz=0;
int pop(){
int ans=heap[1];heap[1]=heap[sz--];
int x=1;//从x往下down
int son=x,flag=0;
while(x*2<=sz&&!flag){
if(heap[x<<1]<heap[x]) son=x<<1;
if(x*2+1<=sz&&heap[x<<1|1]<heap[x<<1]&&heap[x<<1|1]<heap[x]) son=x<<1|1;
if(son!=x) swap(heap[x],heap[son]),x=son;
else flag=1;
}
return ans;
}
void push(int val){
heap[++sz]=val;
int flag=0;
int x=sz;//从x往上push
while(x!=1&&!flag){
if(heap[x>>1]>heap[x]) swap(heap[x>>1],heap[x]),x=x>>=1;
else flag=1;
}
}
int pop_push(int val){
int ans=heap[1];heap[1]=val;
int x=1;//从x往下down
int son=x,flag=0;
while(x*2<=sz&&!flag){
if(heap[x]>heap[x<<1]) son=x<<1;
if(x*2+1<=sz&&heap[x<<1|1]<heap[x]&&heap[x<<1|1]<heap[x<<1]) son=x<<1|1;
if(son!=x) swap(heap[son],heap[x]),x=son;
else flag=1;
}
return ans;
}
void work(int x){
if(sz<k) push(x);
else if(x<=heap[1]) return;
else pop_push(x);
}
public:
int findKthLargest(vector<int>& nums, int k) {
this->heap=new int[k+1],this->k=k,this->sz=0;
for(int i=0;i<nums.size();++i) work(nums[i]);
return heap[1];//取堆顶
}
};
- 基于快排其中的adjust
class Solution {
public:
/*void quick_sort(int l,int r,int* arr){
if(l>=r) return;
int i=l,j=r,x=arr[i];
while(i<j){
while(i<j&&arr[j]>=x) --j;
if(i<j) arr[i++]=arr[j];
while(i<j&&arr[i]<=x) ++i;
if(i<j) arr[j--]=arr[i];
}
arr[i]=x;
quick_sort(l,i-1,arr);
quick_sort(i+1,r,arr);
}*/
int adjust(int l,int r,vector<int>& arr){
swap(a[rand()%(r-l+1)+l],a[l]);
int i=l,j=r,x=arr[i];
while(i<j){
while(i<j&&arr[j]>=x) --j;
if(i<j) arr[i++]=arr[j];
while(i<j&&arr[i]<x) ++i;
if(i<j) arr[j--]=arr[i];
}
arr[i]=x;
return i;
}
int topK(int l,int r,vector<int>& arr,int K){
int dex=adjust(l,r,arr);
while(r-dex+1!=K){
if(r-dex+1>K) l=dex+1,dex=adjust(l,r,arr);
else K-=(r-dex+1),r=dex-1,dex=adjust(l,r,arr);
}
return arr[dex];
}
int findKthLargest(vector<int>& nums, int k) {
return topK(0,nums.size()-1,nums,k);
}
};