首页 > 其他分享 >leetcode 703. 数据流中的第K大元素 小顶堆

leetcode 703. 数据流中的第K大元素 小顶堆

时间:2023-02-21 19:05:25浏览次数:37  
标签:int kthLargest returns 703 add debug 小顶 leetcode numss

建立一个大小为k的最小堆,堆顶就是第k大的元素
数据流中如果有比k大的元素,入堆,重新调整,保持一共k个元素
如果比k小直接返回堆顶即可

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;

#define debug(x) cout<<#x<<": "<<x<<endl;

class KthLargest {
public:
    vector<int> numss;
    int kk;
    KthLargest(int k, vector<int>& nums) {
        kk = k;
        numss = nums;
        make_heap(numss.begin(),numss.end(),greater<int>()  );
        while( numss.size()>kk ){
            pop_heap(numss.begin(),numss.end(),greater<int>()  );
            numss.pop_back();
        }
    }

    int add(int val) {
        if( numss.size() < kk ){
            numss.push_back( val );
            make_heap(numss.begin(),numss.end(),greater<int>()  );
            return numss[0];
        }else if( val <= numss[0] ){
            return numss[0];
        }else{
            numss.push_back( val );
            pop_heap(numss.begin(),numss.end(),greater<int>()  );
            numss.pop_back();
            return numss[0];
        }
        return 0;
    }
};


int main()
{
    int k = 3;
    vector<int> arr = {4,5,8,2};
    KthLargest kthLargest(k,arr);

    debug( kthLargest.add(3) ); // returns 4
    debug( kthLargest.add(5) );// returns 5
    debug( kthLargest.add(10) );// returns 5
    debug( kthLargest.add(9) );// returns 8
    debug( kthLargest.add(4) );// returns 8

    return 0;
}

leetcode 703. 数据流中的第K大元素 小顶堆_#include

标签:int,kthLargest,returns,703,add,debug,小顶,leetcode,numss
From: https://blog.51cto.com/liyunhao/6077014

相关文章

  • leetcode 221. 最大正方形
    dp[i][j]表示以(i,j)为右下角的正方形最大的边长转态转移方程:matrix[i][j]=='1': dp[i][j]=1+min(dp[i-1][j-1],min(dp[i][j-1],dp[i-1][j]));matrix[i][j]=='0':......
  • leetcode 198. 打家劫舍
    dp考虑了前一个房子进不进,发现想复杂了classSolution{public:introb(vector<int>&nums){vector<int>dp(nums.size(),0);intret=0;......
  • leetcode 437. 路径总和 III
    思路:从该结点开始计算sum从该节点开始继承之前的sum重复很多枝,会从一个结点重复开始很多次,需要剪枝classSolution{public:intcnt=0;intsum1=0;......
  • leetcode 405. 数字转换为十六进制数
    除以16取余继续这个过程直到为0对于负数,直接将int转成unsignedint运算即可法二:利用位运算取出每四位,然后对应一个字母classSolution{public:stringtoHe......
  • leetcode 99. 恢复二叉搜索树
    中序遍历,弄在数组里面,再弄个数组复制一份排好序比较哪里错了,换回来中序遍历的时候用map存一下数字的地址(默认没有重复元素)classSolution{public:vector<int>zh......
  • leetcode 40. 组合总和 II
    利用set去重,一维vector判断相等需要都按照一种顺序排好超时classSolution{public:vector<vector<int>>ret;vector<int>can;set<vector<int>>ans;......
  • leetcode 56. 合并区间
    区间左端点进行排序如果intervals小于等于一个元素直接返回如果大于1个按照左边点进行排序从左至右依次合并classSolution{public:staticboolcmp(vector<int>&a,vec......
  • leetcode 589. N叉树的前序遍历
    递归classSolution{public:vector<int>ret;vector<int>preorder(Node*root){findw(root);returnret;}voidfindw(Node*root){......
  • leetcode 307. 区域和检索 - 数组可修改 前缀和 | 线段树
    前缀和查询是O(1)更新是O(n)classNumArray{public:vector<int>sum;vector<int>nums;NumArray(vector<int>&nums){this->nums=nums;sum......
  • leetcode 382. 链表随机节点
    从头开始计数第i个点选择的概率是只需要区[0,i-1]的随机数,如果,取到了0,就更新返回值,否则不更新classSolution{public:/**@paramheadThelinkedlist'shead.......