您的位置:首页 > 职场人生

剑指Offer(第二版)面试题30:包含min函数的栈

2017-06-19 22:02 519 查看
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/73477461冷血之心的博客)

剑指Offer(第二版)面试题30:包含min函数的栈
题目:包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。在该栈中,调用min、push和pop方法
的时间复杂度均为O(1)


思路:
题目要求我们的各个方法均为O(1)复杂度,则我们考虑增加辅助空间来实现,即增加一个专门用来存储min值的辅助栈。
比如,data中依次入栈,5,  4,  3, 8, 10, 11, 12, 1
则min依次入栈,5,  4,  3,no,no, no, no, 1

no代表此次不如栈
每次入栈的时候,如果入栈的元素比min中的栈顶元素小或等于则入栈,否则不入栈。

java实现最小栈的代码如下:
import java.util.Stack;
/*
* 题目:包含min函数的栈
* 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。在该栈中,调用min、push和pop方法
* 的时间复杂度均为O(1)
*/

public class Main {

Stack<Integer> stack = new Stack<>();
Stack<Integer> minStack = new Stack<>();

/**
* 首先将值push进普通栈stack中,
* 判断是否需要将值放入minStack中
* @param node
*/
public void push(int node) {
stack.push(node);
if(minStack.isEmpty()||minStack.peek()>=node)
minStack.push(node);
}

/**
* 首先需要对stack执行出栈操作,
* 判断minStack中是否需要出栈操作
*/
public void pop() {
stack.pop();
if(stack.peek()==minStack.peek()){
minStack.pop();
}
}

public int top() {
return stack.peek();
}

/**
* 直接peek minStack
* @return
*/
public int min() {
return minStack.peek();
}
}

需要注意的地方:
该实现算法中,在push和pop操作中,均有判断,判断值相等一定要用peek方法而不是pop!!!切记切记,关键点。

以上实现中,minStack中的个数一般少于当前stack中的个数。比较简单一点。

以下是剑指Offer中提供的思路,个人认为不是特别好。
比如,data中依次入栈,5,  4,  3, 8, 10, 11, 12, 1
则min依次入栈,5,  4,  3,3  , 3 , 3 , 3 , 1

即每次push操作时,如果目标值比minStack栈顶的值大,则将min栈顶的元素再次push进去。(多余是不是?)min函数被调用时,要执行pop操作(太多余了这样?)

牛客网AC地址:
https://www.nowcoder.com/practice/4c776177d2c04c2494f2555c9fcc1e49?tpId=13&tqId=11173&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking


如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~

本群给大家提供一个学习交流的平台,内设菜鸟Java管理员一枚、精通算法的金牌讲师一枚、Android管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚以及C#管理一枚。欢迎大家进来交流技术。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: