力扣1172.餐盘栈

力扣1172.餐盘栈

  • 优先队列 + 栈

    • 优先队列维护所有非满栈下标
cpp 复制代码
  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;
      }
  };
相关推荐
Sam_Deep_Thinking2 小时前
学数据结构到底有什么用
数据结构
kobesdu2 小时前
人形机器人SLAM:技术挑战、算法综述与开源方案
算法·机器人·人形机器人
椰羊~王小美4 小时前
随机数概念及算法
算法
阿Y加油吧5 小时前
算法实战笔记:LeetCode 169 多数元素 & 75 颜色分类
笔记·算法·leetcode
不要秃头的小孩5 小时前
力扣刷题——509. 斐波那契数
python·算法·leetcode·动态规划
We་ct5 小时前
LeetCode 120. 三角形最小路径和:动态规划详解
前端·javascript·算法·leetcode·typescript·动态规划
py有趣6 小时前
力扣热门100题之和为K的子数组
数据结构·算法·leetcode
hipolymers6 小时前
C语言怎么样?难学吗?
c语言·数据结构·学习·算法·编程
CS创新实验室7 小时前
从“跑得动”到“跑得稳”:深度剖析数据结构究竟是理论点缀还是核心战力?
数据结构