设计一个带有getmin功能的栈,保证时间复杂度在O(1)
2017-06-22 20:56:10
需要得到最小值,最简单的思路就是遍历一遍求出最小值。但是这样的时间复杂度会是O(n),不满足O(1)的要求。于是想到在建立一个栈来保存最小值。
具体操作是建立两个栈,一个存放数据,一个存放最小值。
push:首先将数据压入数据栈,若最小值栈为空,则将之压入最小值栈,若最小值栈非空,则需要比较它和最小值栈的顶部数据,若小于等于,则将之压入。这里用到的思想就是,如果当前压入的数据比最小值大,那么目前数据栈的最小值就是最小值栈的栈顶元素,反之则需要将之压入;
pop:将数据栈的元素弹出时需要比较他和最小值栈的栈顶元素大小,若等于的话,也需要将最小值栈的栈顶元素pop出来;
getmin:只需要将最小值栈的栈顶元素返回即可。
1 class Mystack
2 {
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;
}
}
设计一个带有getmin功能的栈,保证时间复杂度在O(1)的更多相关文章
- 栈和队列----设计一个有getMin功能的栈
设计一个有getMin功能的栈 设计一个具有getMin功能的栈,可以返回栈中的最小的元素,可以使用现有的栈的数据结构,要求pop/push/getMin操作的时间复杂度是O(1). package ...
- 算法与数据结构题目的 PHP 实现:栈和队列 设计一个有 getMin 功能的栈
刚入手了一本<程序员代码面试指南>,书中题目的代码都是 Java 实现的,琢磨着把这些代码用 PHP 敲一遍,加深印象. 题目:设计一个有 getMin 功能的栈 —— 实现一个特殊的栈, ...
- 设计一个有getMin功能的栈
[说明]: 本文是左程云老师所著的<程序员面试代码指南>第一章中“设计一个有getMin功能的栈”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解析说明 ...
- 《程序员代码面试指南》第一章 栈和队列 设计一个有getMin功能的栈
题目 实现一个特殊的栈,在实现栈的基本功能上,再实现返回栈中最小的元素的操作 要求 1. pop.push.getMin操作时间复杂度都是O(1) 2. 设计的栈类型可以使用现成的栈结构 java代码 ...
- 栈和队列问题:设计一个有 getMin 功能的栈
[知识点] 栈是一个先进后出(FILO-First In Last Out)的数据结构,队列是一种先进先出(FIFO-First In First Out)的数据结构. [题目] 实现一个特殊的栈,在 ...
- 设计一个有getMin功能的栈(2)
题目: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 要求: 1.pop.push.getMin操作的时间复杂度都是O(1) 2.设计的栈类型可以输用现成的栈结构 解答 ...
- 设计一个有getMin功能的栈(1)
题目: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 要求: 1.pop.push.getMin操作的时间复杂度都是O(1) 2.设计的栈类型可以输用现成的栈结构 解答 ...
- 常见面试算法题JS实现-设计一个有getMin功能的栈
前言: 已经确定工作了-下周一正式入职,按理说应该是可以好好浪荡一周的,但是内心总是不安,总觉得自己这个水平真的太菜了,还是趁着现在有自己的时间,赶紧多看看书,多学习学习吧orz所以把之前校招买的书, ...
- 左神算法书籍《程序员代码面试指南》——1_01设计一个有getMin功能的栈
[题目] 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. [要求] 1.pop.push.getMin操作的时间复杂度都是O(1).2.设计的栈类型可以使用现成的栈结构. ...
随机推荐
- devexpress 之 ChartControl
\}5#~mV#cr(/k1yIZ7.Lg
- 【题解】Luogu P2073 送花
原题传送门 这题需要用到Splay 我们用一棵splay维护金钱 考虑c<=1000000 我们珂以把每种价格现在对应的美丽值存在一个a数组中 这样讲有珂能不太清楚qaq,还是对着操作一个一个讲 ...
- linux判断日志文件大小进行清理
脚本写了一个死循环,根据nohup产生的日志多大, 这里表示日志超过500M之后清理, 具体数字可自定义 睡眠数可自定义 #!/usr/bin/bash while true do s=`du -k ...
- 20145208 蔡野 《网络对抗》Exp8 Web基础
20145208 蔡野 <网络对抗>Exp8 Web基础 本实践的具体要求有: (1).Web前端HTML(1分) 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POS ...
- Node复习
简单复习下node,不过很多重要的知识点是图,文字无法展示出来. 1.Node的特点 异步I/O 事件与回调函数 单线程 跨平台(libuv) 2.Node的应用场景 I/O密集型(事件循环.异步I/ ...
- 2015,3,10 1(南阳理工ACM)
描述输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输入一个数N,表示有N组测试数据.后面的N行输入多组数据,每组输入数据都是占一行,有三个字符组成, ...
- HDU 1689 Just a Hook (线段树区间更新+求和)
Just a Hook Problem Description In the game of DotA, Pudge's meat hook is actually the most horrible ...
- Pollard Rho大质数分解学习笔记
目录 问题 流程 代码 生日悖论 end 问题 给定n,要求对n质因数分解 普通的试除法已经不能应用于大整数了,我们需要更快的算法 流程 大概就是找出\(n=c*d\) 如果\(c\)是素数,结束,不 ...
- [蓝桥] 算法训练 P0505
时间限制:1.0s 内存限制:256.0MB 一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积.阶乘的增长速度非常快,例如,13!就已经比较大了,已经无法存放在一个整型变量中:而35!就更 ...
- promise对象的使用
ES6中的promise的出现给我们很好的解决了回调地狱的问题,在使用ES5的时候,在多层嵌套回调时,写完的代码层次过多,很难进行维护和二次开发,ES6认识到了这点问题, 现在promise的使用,完 ...