设计一个带有getmin功能的栈,保证时间复杂度在O(1)
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)相关推荐
- 《程序员代码面试指南》第一章 栈和队列 设计一个有getMin功能的栈
题目 实现一个特殊的栈,在实现栈的基本功能上,再实现返回栈中最小的元素的操作 要求 1. pop.push.getMin操作时间复杂度都是O(1) 2. 设计的栈类型可以使用现成的栈结构 java代码 ...
- 设计一个有getMin功能的栈 (python)
题目: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作 要求: 1.pop.push.getMin操作的时间复杂度都是O(1) 2.设计的栈类型可以使用现成的栈结构 解决办 ...
- 栈和队列之设计一个有getMin(得到最小值)功能的栈
有2中方案,分别用类和内部类实现了 import java.util.Stack;/*** @author chenyu 第一种设计:* 题目:设计一个有getMin功能的栈,设计一个特殊的栈,在实现 ...
- LeetCode 1381. 设计一个支持增量操作的栈(deque/数组)
1. 题目 请你设计一个支持下述操作的栈. 实现自定义栈类 CustomStack : CustomStack(int maxSize):用 maxSize 初始化对象,maxSize 是栈中最多能容 ...
- 1381. 设计一个支持增量操作的栈
2020-05-11 1.题目描述 设计一个支持增量操作的栈 2.题解 使用vector在进行增量操作的时候会方便一些,vector支持push_back.pop_back.empty操作. 3.代码 ...
- LeetCode 5357. 设计一个支持增量操作的栈
5357. 设计一个支持增量操作的栈 思路:用数组实现即可 class CustomStack { public:CustomStack(int maxSize) {fill(a,a+1001,-1) ...
- LeetCode 2296. 设计一个文本编辑器(双栈)
文章目录 1. 题目 2. 解题 1. 题目 请你设计一个带光标的文本编辑器,它可以实现以下功能: 添加:在光标所在处添加文本. 删除:在光标所在处删除文本(模拟键盘的删除键). 移动:将光标往左或者 ...
- 常考数据结构与算法:设计getMin功能的栈
题目描述 实现一个特殊功能的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 示例1 输入 [[1,3],[1,2],[1,1],[3],[2],[3]] 返回值 [1,2] 备注: 有 ...
- 栈与队列1——设计getMin功能的栈
题目 设计栈,实现基本功能的前提下,实现返回栈内最小元素的功能 要求 1.push,pop,getmin()复杂度为O(1) 2.允许使用现成栈结构 解决思路 使用两个栈,stackData和stac ...
最新文章
- jzoj3085. 图的计数
- Linux awk+uniq+sort 统计文件中某字符串出现次数并排序
- 计算机简单游戏有什么用,简单又好玩的互动游戏 简单又好玩的互动游戏有哪些...
- C语言中的“悬空指针”和“野指针”是什么意思?
- ubuntu安装Redis+安装mysql(配置远程登录)+安装jdk+安转nginx+安转teamviewer+安装terminator+安装sublime
- 只有数学老师懂的15个泪流满面的瞬间~
- Java多线程基础学习一:线程的6种状态和相互转化
- SVN使用教程总结[转]
- 汇编语言定时器转化为c语言,不用定时器和汇编语言,只用C语言实现精确无误的延时...
- tensorflow2 目标检测_BJX 系列 小型远距离检测型光电传感器代理报价
- HttpClient 模拟登录网易微博
- deebot扫地机器人使用_石头扫地机器人T7 Pro使用体验 避障更加“聪明”
- 魔乐手机管家V2.0内测版惊艳亮相--Android软件
- 薅羊毛!某东、某宝、某宁一次搞定~
- 逻辑回归(logistics regression)
- RPL(4):RFC6550翻译(4)---RPL的通信流支持RPL实例
- 用c 语言循环抓取网页,C语言获取网页源代码
- 【C++】C++顺序栈实现的计算器
- Eclipse修改背景颜色(豆沙绿)
- linux的翻译系统开发,Linux下类似金山词霸的翻译软件