2017-06-22  20:56:10

需要得到最小值,最简单的思路就是遍历一遍求出最小值。但是这样的时间复杂度会是O(n),不满足O(1)的要求。于是想到在建立一个栈来保存最小值。

具体操作是建立两个栈,一个存放数据,一个存放最小值。

push:首先将数据压入数据栈,若最小值栈为空,则将之压入最小值栈,若最小值栈非空,则需要比较它和最小值栈的顶部数据,若小于等于,则将之压入。这里用到的思想就是,如果当前压入的数据比最小值大,那么目前数据栈的最小值就是最小值栈的栈顶元素,反之则需要将之压入;

pop:将数据栈的元素弹出时需要比较他和最小值栈的栈顶元素大小,若等于的话,也需要将最小值栈的栈顶元素pop出来;

getmin:只需要将最小值栈的栈顶元素返回即可。

 1 class Mystack2 {3     stack<int> s1;4     stack<int> mins;5 6 public:7     void pop()8     {9         if(s1.empty()) {cout<<"栈空\n"; return;}
10         else
11         {
12             int temp = s1.top();
13             if(temp == mins.top()){mins.pop();}
14             s1.pop();
15         }
16     }
17
18     void push(int key)
19     {
20         if(mins.empty()) {mins.push(key);cout<<"mins "<<key<<endl;s1.push(key);}
21         else
22         {
23             if(mins.top() >= key) {mins.push(key);cout<<"mins "<<key<<endl;}
24             s1.push(key);
25         }
26     }
27
28     void getmin()
29     {
30         if(mins.empty()) {cout<<"当前栈为空\n";}
31         else cout<<mins.top()<<endl;
32     }
33 }

还有一种只采用一个栈就能解决的方法,具体步骤是遇到小于等于当前最小值的数,也就是会改变最小值的数,将当前最小值压栈,并修改最小值,然后将当前数压栈,否则直接压栈。

在pop的时候需要对当前的pop出的数值进行判断,如果等于最小值,那么意味着,最小值将会被,改变所以需要pop两次。

public class MinStack {Stack<Integer> s;int min;/** initialize your data structure here. */public MinStack() {s = new Stack<>();min = Integer.MAX_VALUE;}public void push(int x) {if(x <= min) {s.add(min);min = x;}s.add(x);}public void pop() {if(s.pop() == min) min = s.pop();}public int top() {return s.peek();}public int getMin() {return min;}
}

转载于:https://www.cnblogs.com/TIMHY/p/7067173.html

设计一个带有getmin功能的栈,保证时间复杂度在O(1)相关推荐

  1. 《程序员代码面试指南》第一章 栈和队列 设计一个有getMin功能的栈

    题目 实现一个特殊的栈,在实现栈的基本功能上,再实现返回栈中最小的元素的操作 要求 1. pop.push.getMin操作时间复杂度都是O(1) 2. 设计的栈类型可以使用现成的栈结构 java代码 ...

  2. 设计一个有getMin功能的栈 (python)

    题目: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作 要求: 1.pop.push.getMin操作的时间复杂度都是O(1) 2.设计的栈类型可以使用现成的栈结构 解决办 ...

  3. 栈和队列之设计一个有getMin(得到最小值)功能的栈

    有2中方案,分别用类和内部类实现了 import java.util.Stack;/*** @author chenyu 第一种设计:* 题目:设计一个有getMin功能的栈,设计一个特殊的栈,在实现 ...

  4. LeetCode 1381. 设计一个支持增量操作的栈(deque/数组)

    1. 题目 请你设计一个支持下述操作的栈. 实现自定义栈类 CustomStack : CustomStack(int maxSize):用 maxSize 初始化对象,maxSize 是栈中最多能容 ...

  5. 1381. 设计一个支持增量操作的栈

    2020-05-11 1.题目描述 设计一个支持增量操作的栈 2.题解 使用vector在进行增量操作的时候会方便一些,vector支持push_back.pop_back.empty操作. 3.代码 ...

  6. LeetCode 5357. 设计一个支持增量操作的栈

    5357. 设计一个支持增量操作的栈 思路:用数组实现即可 class CustomStack { public:CustomStack(int maxSize) {fill(a,a+1001,-1) ...

  7. LeetCode 2296. 设计一个文本编辑器(双栈)

    文章目录 1. 题目 2. 解题 1. 题目 请你设计一个带光标的文本编辑器,它可以实现以下功能: 添加:在光标所在处添加文本. 删除:在光标所在处删除文本(模拟键盘的删除键). 移动:将光标往左或者 ...

  8. 常考数据结构与算法:设计getMin功能的栈

    题目描述 实现一个特殊功能的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 示例1 输入 [[1,3],[1,2],[1,1],[3],[2],[3]] 返回值 [1,2] 备注: 有 ...

  9. 栈与队列1——设计getMin功能的栈

    题目 设计栈,实现基本功能的前提下,实现返回栈内最小元素的功能 要求 1.push,pop,getmin()复杂度为O(1) 2.允许使用现成栈结构 解决思路 使用两个栈,stackData和stac ...

最新文章

  1. jzoj3085. 图的计数
  2. Linux awk+uniq+sort 统计文件中某字符串出现次数并排序
  3. 计算机简单游戏有什么用,简单又好玩的互动游戏 简单又好玩的互动游戏有哪些...
  4. C语言中的“悬空指针”和“野指针”是什么意思?
  5. ubuntu安装Redis+安装mysql(配置远程登录)+安装jdk+安转nginx+安转teamviewer+安装terminator+安装sublime
  6. 只有数学老师懂的15个泪流满面的瞬间~
  7. Java多线程基础学习一:线程的6种状态和相互转化
  8. SVN使用教程总结[转]
  9. 汇编语言定时器转化为c语言,不用定时器和汇编语言,只用C语言实现精确无误的延时...
  10. tensorflow2 目标检测_BJX 系列 小型远距离检测型光电传感器代理报价
  11. HttpClient 模拟登录网易微博
  12. deebot扫地机器人使用_石头扫地机器人T7 Pro使用体验 避障更加“聪明”
  13. 魔乐手机管家V2.0内测版惊艳亮相--Android软件
  14. 薅羊毛!某东、某宝、某宁一次搞定~
  15. 逻辑回归(logistics regression)
  16. RPL(4):RFC6550翻译(4)---RPL的通信流支持RPL实例
  17. 用c 语言循环抓取网页,C语言获取网页源代码
  18. 【C++】C++顺序栈实现的计算器
  19. Eclipse修改背景颜色(豆沙绿)
  20. linux的翻译系统开发,Linux下类似金山词霸的翻译软件

热门文章

  1. 【bzoj2463】 谁能赢呢?
  2. CoreData和SQLite多线程访问时的线程安全问题
  3. javascript经典广告代码.rar
  4. springmvc静态资源;mvc:default-servlet-handler后Controller失效
  5. stark组件开发之添加功能实现
  6. TRIZ系列-创新原理-23-反馈原理
  7. node实战学习纪录
  8. 如何在vue里面正确的引用 jquery 和 第三方插件
  9. interceptor拦截器典型应用实例----数据稽核
  10. Oracle 9i 数据库 创建数据库 Net 配置 创建表 SQL查询 创建存储过程 (图)