当前位置: 首页 > news >正文

[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 }

相关文章:

  • iOS开发- 隐藏状态栏(电池栏)
  • 惊人的超速学习实验
  • EASYUI Dialog的基本使用
  • 文本阴影text-shadow全兼容
  • mysql 1040错误Too many connections的方法
  • 由su和su -的区别谈学习linux运维方法
  • 自动升级系统的设计与实现(续2) -- 增加断点续传功能 (附最新源码)
  • Dom4j递归输出所有的接点和值
  • 数据预处理
  • 流控PANABIT 12在ESX里安装小结
  • Oracle的oci和thin的不同
  • 几个 vim 的块操作命令
  • Android进阶:打jar包获取assets中的资源 解决selector XML文件不能解...
  • 模拟实现兼容低版本IE浏览器的原生bind()函数功能
  • oracle中exp,imp(导入,导出)的使用详解
  • ES6指北【2】—— 箭头函数
  • #Java异常处理
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • Angular6错误 Service: No provider for Renderer2
  • C# 免费离线人脸识别 2.0 Demo
  • co.js - 让异步代码同步化
  • ECS应用管理最佳实践
  • HTTP中GET与POST的区别 99%的错误认识
  • js 实现textarea输入字数提示
  • python_bomb----数据类型总结
  • sessionStorage和localStorage
  • 创建一个Struts2项目maven 方式
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 复杂数据处理
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 如何选择开源的机器学习框架?
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 译有关态射的一切
  • #include
  • (day 12)JavaScript学习笔记(数组3)
  • (Python第六天)文件处理
  • (转)LINQ之路
  • (转)nsfocus-绿盟科技笔试题目
  • (转)可以带来幸福的一本书
  • ./configure,make,make install的作用
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .net6使用Sejil可视化日志
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .Net小白的大学四年,内含面经
  • .php文件都打不开,打不开php文件怎么办
  • []FET-430SIM508 研究日志 11.3.31
  • []指针
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [AIGC] 如何建立和优化你的工作流?
  • [Android Studio 权威教程]断点调试和高级调试
  • [Android 数据通信] android cmwap接入点
  • [BetterExplained]书写是为了更好的思考(转载)
  • [BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)