zoukankan      html  css  js  c++  java
  • [CareerCup][Google Interview] 实现一个具有get_min的Queue

    Implement a queue in which push_rear(), pop_front() and get_min() are all constant time operations.

    http://www.careercup.com/question?id=7263132给出了很精彩的解答。

    主要的思想是维护一个min_queue,保存当前队列最小值,当新加入一个元素时,min_queue遵照这样的规则

    从min_queue的尾部开始和新加入元素(key)比较,当min_queue.back() > key时,弹出back(),直到back()<= key,或者min_queue为空。

    当要返回min时,return min_queue.front()

    而pop()时,比较queue.front() == min_queue.front(),相等则min_queue.pop_front()

    这里,最关键的思想是后来的key和min_queue从后往前比较,能够保证min_queue是一个非降序列,这样就能维护一个当前队列的最小值序列。

    分摊下来,每个操作O(1)

     1 #include <iostream>
     2 #include <deque>
     3 using namespace std;
     4 
     5 class Queue
     6 {
     7 private:
     8     deque<int> q;
     9     deque<int> minq;
    10 
    11 public:
    12     void push(int key)
    13     {
    14         q.push_back(key);
    15         while(!minq.empty())
    16         {
    17             if (minq.back() > key)
    18                 minq.pop_back();
    19             else
    20                 break;
    21         }
    22         minq.push_back(key);
    23     }
    24 
    25     int pop()
    26     {
    27         int element = q.front();
    28         q.pop_front();
    29         if (element == minq.front())
    30             minq.pop_front();
    31         return element;
    32     }
    33 
    34     int get_min()
    35     {
    36         return minq.front();
    37     }
    38 };
    39 
    40 int main()
    41 {
    42     Queue q;
    43 
    44     q.push(12);
    45     cout << q.get_min() << endl;
    46 
    47     q.push(4);
    48     cout << q.get_min() << endl;
    49 
    50     q.push(8);
    51     cout << q.get_min() << endl;
    52 
    53     q.pop();
    54     q.pop();
    55     cout << q.get_min() << endl;
    56 
    57     q.push(7);
    58     cout << q.get_min() << endl;
    59 
    60     q.pop();
    61     cout << q.get_min() << endl;
    62 
    63     q.push(6);
    64     q.push(6);
    65     cout << q.get_min() << endl;
    66 
    67     q.pop();
    68     cout << q.get_min() << endl;
    69 }
  • 相关阅读:
    call me
    互相关注请留言!我也会及时关注你的哦!
    tomcat单机多实例
    powerdesigner导出rtf
    IDEA快捷键
    SQLyog Enterprise Trial 试用期问题
    ubuntu 16.04 忘记root密码
    使用Xshell连接ubuntu
    观察者模式(Observer)和发布(Publish/订阅模式(Subscribe)的区别
    jvm方法栈
  • 原文地址:https://www.cnblogs.com/chkkch/p/2754130.html
Copyright © 2011-2022 走看看