[抄题]:

实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。

你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成。

[思维问题]:

想不到,脑洞不够大

[一句话思路]:

用一个minstack来辅助实现

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. 主函数中,数据结构为类+名 类是Stack<Integer>
  2. minStack.empty() == true 或者isempty都可以
  3. pop分为两种情况:二者peek(不是peak)相等的、不相等的; 方法加点来用

[二刷]:

  1. push可能有空的情况,要注意

[总结]:top只是看一看,peek也只是看一看。所以top里面包含peek

[复杂度]:Time complexity: O(1) Space complexity: O(n)

[英文数据结构,为什么不用别的数据结构]:

[其他解法]:

[Follow Up]:

[题目变变变]:

public class MinStack {
private Stack<Integer> stack;
private Stack<Integer> minStack; public MinStack() {
// do intialization if necessary
stack = new Stack<Integer>();
minStack = new Stack<Integer>();
} /*
* @param number: An integer
* @return: nothing
*/
public void push(int number) {
// write your code here
stack.push(number);
if (minStack.isEmpty()) {
minStack.push(number);
}
else {
if (number <= minStack.peek()) {
minStack.push(number);
}
}
} /*
* @return: An integer
*/
public int pop() {
// write your code here
if (stack.peek().equals(minStack.peek())) {
minStack.pop();
}
return stack.pop();
} /*
* @return: An integer
*/
public int min() {
// write your code here
return minStack.peek();
}
}
class MinStack {
Stack<Integer> stack = new Stack<Integer>();
Stack<Integer> minStack = new Stack<Integer>(); /** initialize your data structure here. */
public MinStack() {
Stack<Integer> stack = new Stack<Integer>();
Stack<Integer> minStack = new Stack<Integer>();
} public void push(int x) {
//stack: push
stack.push(x);//s:2 //min stack:push when it's null or minimum
if (minStack.isEmpty()) {
minStack.push(x);
} else if (x <= minStack.peek()) {
minStack.push(x); //ms:2
}
} public void pop() {
//stack:get, min stack: pop when it's mean
if (minStack.peek().equals(stack.peek())) {
minStack.pop(); //both 2, ms pop 2
}
stack.pop(); //s pop 2
} public int top() {
return stack.peek(); //return s pop 2
} public int getMin() {
return minStack.peek(); //return ms pop 2
}
} /**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/

解法2: 只用1个stack

[抄题]:

[暴力解法]:

时间分析:

空间分析:

[奇葩输出条件]:

[奇葩corner case]:

[思维问题]:

不懂题目意思:设计新的数据结构。原生的stack中本来就有push pop peek方法

[一句话思路]:

刷新最小值时 stack中存2个 留着最小值备胎。否则只存1个 要走就走,下面一层还是最小值。

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. pop一个元素之后把备胎也pop出去,以便于下次的pop, 不留痕迹
  2. class中声明后,MinStack()方法用于建立新的数据类型(真心是没话可说了)

[二刷]:

[三刷]:

[四刷]:

[五刷]:

[五分钟肉眼debug的结果]:

[总结]:

备胎需要斩草除根

[复杂度]:Time complexity: O(1) Space complexity: O(n)

都是立存立取的

[英文数据结构或算法,为什么不用别的数据结构或算法]:

原生的stack中本来就有push pop peek方法

[关键模板化代码]:

[其他解法]:

2个stack

[Follow Up]:

[LC给出的题目变变变]:

716. Max Stack 2个stack

[代码风格] :

带最小值操作的栈 · Min Stack的更多相关文章

  1. lintcode12 带最小值操作的栈

    实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值. 你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成. 建一个栈helpStack,用来存放从 ...

  2. LintCode-12.带最小值操作的栈

    带最小值操作的栈 实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值. 你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成. 注意事项 如果堆栈中 ...

  3. LintCode 12.带最小值操作的栈(两种方法实现)

    题目描述 实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值. 你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成. 样例 如下操作:push(1 ...

  4. [LintCode] 带最小值操作的栈

    class MinStack { public: MinStack() { // do initialization if necessary } void push(int number) { // ...

  5. LeetCode 155:最小栈 Min Stack

    LeetCode 155:最小栈 Min Stack 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- ...

  6. [Swift]LeetCode155. 最小栈 | Min Stack

    Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...

  7. lintcode 中等题:Min stack 最小栈

    题目 带最小值操作的栈 实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值. 你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成. 解题 可以定义 ...

  8. LeetCode 刷题笔记 155. 最小栈(Min Stack)

    tag: 栈(stack) 题目描述 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素 ...

  9. [LeetCode] 0155. Min Stack 最小栈 & C++Runtime加速

    题目 Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. ...

随机推荐

  1. php multicast多播实现详解

    什么是多播? 网络中存在3中传播形式,单播,广播,多播. 1. 单播 : 就是1->1 2. 广播 : 1->多(广播域内) 3. 多播 : 1->组(一组ip) 1 2 3 4 5 ...

  2. Spark分析之DAGScheduler

    DAGScheduler概述:是一个面向Stage层面的调度器: 主要入参有: dagScheduler.runJob(rdd, cleanedFunc, partitions, callSite, ...

  3. Helm 入门安装指南

    Helm 是 Kubernetes 生态系统中的一个软件包管理工具.本文将介绍 Helm 中的相关概念和基本工作原理,并通过一个具体的示例学习如何使用 Helm 打包.分发.安装.升级及回退 Kube ...

  4. Data Provider 中没有.net framework Data provider for Mysql 的解决方法

    近来做的一个项目中,数据库用的是 MySql, 而在项目使用 Entity Data Model 来做数据服务层,可是在项目中添加 Data Entty Model 时,一般我们都会选择从数据库中直接 ...

  5. RowToColumn

    SELECT S.NAME, sum(decode(S.COURSE,'语文',S.SCORE,0))"语文", sum(decode(S.COURSE,'数学',S.SCORE, ...

  6. 用dataset保存数据注意的问题

    Private Function Save() As Boolean Try Dim dschgs As DataSet = ds.GetChanges(DataRowState.Added + Da ...

  7. 关于生成器---(yield)

    生成器:是自定义的迭代器(自己用python代码写的迭代器),函数中见到yield的就是生成器 那么yield前后的变量又该怎么理解 看例子一 def counter(name): print('%s ...

  8. 配置Ubuntu虚拟环境

    1.ubuntu默认root用户没有激活,激活root用户,就要为root用户创建密码 $sudo passwd root   2.修改主机名 $vi /etc/hostname   3.安装ssh服 ...

  9. CUDA C Programming Guide 在线教程学习笔记 Part 3

    ▶ 表面内存使用 ● 创建 cuda 数组时使用标志 cudaArraySurfaceLoadStore 来创建表面内存,可以用表面对象(surface object)或表面引用(surface re ...

  10. phpExcel中文帮助手册

    phpExcel中文帮助手册 Admin 2011年11月13日 名人名言:上人生的旅途吧.前途很远,也很暗.然而不要怕.不怕的人的面前才有路.——有岛武郎 下面是总结的几个应用办法 include ...