leetcode 215. 数组中的第K个最大元素

题目
因为这题还和男朋友吵了一架,无语。肯定是平常没人吵架,就知道吵我吵我吵我吵我。呵呵呵呵呵呵呵额呵呵呵呵呵呵呵呵呵呵。看来不能留着过年了。
在这里插入图片描述

  1. 维护一个只有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];//取堆顶
    }
};
  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);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值