力扣1172.餐盘栈

力扣1172.餐盘栈

  • 优先队列 + 栈

    • 优先队列维护所有非满栈下标
  •   class DinnerPlates {
          int k = 0;
          vector<stack<int>> stacks;
          priority_queue<int,vector<int>,greater<>> idx;
      public:
          DinnerPlates(int capacity) {
              k = capacity;
          }
          
          void push(int val) {
              //处理所有越界下标
              if(!idx.empty() && idx.top() >= stacks.size())
                  while(!idx.empty()) idx.pop();
              if(idx.empty())
              {
                  stack<int> st;
                  st.push(val);
                  stacks.emplace_back(st);
                  if(k > 1)
                      idx.push(stacks.size() - 1);
              }
              else
              {
                  auto &st = stacks[idx.top()];
                  st.push(val);
                  //满了就弹出队列
                  if(st.size() == k)
                      idx.pop();
              }
          }
          
          int pop() {
              //相当于删最后一个
              return popAtStack(stacks.size() - 1);
          }
          
          int popAtStack(int index) {
              //不合法操作
              if (index < 0 || index >= stacks.size() || stacks[index].empty())
                  return -1;
              auto &st = stacks[index];
              //如果是满栈,删了以后必定不满,如果是非满栈,则一定已经在队列里了
              if(st.size() == k)
                  idx.push(index);
              int val = st.top();
              st.pop();
              //处理尾部空栈
              while(!stacks.empty() && stacks.back().empty())
                  stacks.pop_back();
              return val;
          }
      };
    
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光男孩01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值