[b.d]--算法题-求含有min函数的栈的实现
来源:互联网 发布:java get post 编辑:程序博客网 时间:2024/04/27 16:02
带有min函数的栈
1. 空间复杂度是O(n)
这种情况没什么好说的,利用一个同等大的辅助栈,如果入栈数据的数据比辅助栈辅助栈栈顶数据小,就更新辅助栈数据,如果大于或则等于辅助栈的栈顶,就直接吧辅助栈的栈顶复制一次再入辅助栈就行了。
这种方法比较简单,没什么说的,也不给出实现了,百度一大堆。
2. 空间复杂度的优化版本
前面的一种解法,存在大量的重复元素被插入辅助栈,辅助栈是可以进行优化的。下面给出优化算法:
(1)每次入栈时进行判断,如果辅助栈为null,就直接把元素入栈;
(2)如果辅助栈非空,判断入栈元素是否大于辅助栈栈顶,大于就啥也不干,否则就把元素入辅助栈(这里包括入栈元素小于或则等于辅助栈栈顶)
(3)出栈的时候,如果数据栈是最后一个元素,辅助栈肯定同步出栈。 如果出栈数据等于辅助栈顶元素,辅助栈就出栈。
下面给出是实现代码:
package algorithm.baidu;import java.util.Stack;/** * Created by louyuting on 2017/2/27. * Question: 带min函数的栈 的 辅助栈的优化 */public class MinStack2 { public static Stack<Integer> stack = new Stack<Integer>(); public static Stack<Integer> stack2 = new Stack<Integer>(); //入栈优化 public static void push(Integer num){ stack.push(num);//元素入数据栈 if(stack2.isEmpty()){ stack2.push(num); }else { //1. 如果入栈数据num比辅助栈的栈顶的数据大, 辅助栈就不必入栈,避免内存浪费 if(num > stack2.lastElement()) { // } else{//2. 如果入栈数据num比辅助栈的栈顶的数据小或则等于, 辅助栈就入栈, stack2.push(num); } } } //出栈 public static Integer pop(){ int result = stack.pop(); //如果栈中是最后一个元素了,辅助栈肯定要同步出栈 if(stack.size()==1) stack2.pop();//删除辅助栈的栈顶 else { //出栈数据等于出栈后的栈顶数据, 辅助栈出站 if(result == stack2.lastElement()) { stack2.pop(); } else if(result > stack2.lastElement()){ //不管 } } return result; } //获取最小值 public static Integer min(){ return stack2.lastElement(); } public static void main(String[] args) { MinStack2.push(1); MinStack2.push(0); MinStack2.push(1); MinStack2.push(0); MinStack2.push(1); MinStack2.push(0); MinStack2.push(1); while (!stack.isEmpty()) { System.out.println("current max : " + MinStack2.min()); MinStack2.pop(); } }}
我测试的没有bug, 如果有好友测试出BUG,欢迎留言。
0 0
- [b.d]--算法题-求含有min函数的栈的实现
- 定义含有min函数的栈
- 剑指Offer 含有Min函数的栈
- 【25】实现一个含有min函数的栈的通用模板
- 含有max或min方法的栈实现
- 实现min函数的栈
- 【July第2题】创建含有min函数的栈数据结构
- 算法题目---包含min函数的栈
- 算法题3 设计包含min函数的栈
- 算法题23 带min函数的栈
- 实现包含min函数的栈
- 包含min函数的栈 java实现
- 包含min函数的栈JAVA实现
- 包含min函数的栈java实现
- [b.d]--算法题-求万级别的电话号码的排序
- 含有min()函数的栈,各种操作时间复杂度为O(1)
- 含有min()函数的栈,各种操作时间复杂度为O(1)
- 对于实现栈中min成员函数的算法设计的改进
- LIDC数据集肺区分割
- C语言学习------3.1 结构体和共用体
- Express实现Session+Cookie认证
- 语音增强原理之增益因子
- Oracle Database Vault关闭方法(二)
- [b.d]--算法题-求含有min函数的栈的实现
- 【Android】- Android Studio打包签名的流程
- canvas系类-非零坏绕原则(二)制作剪纸效果
- 应用程序的内存的分类
- 数据库Oracle之用户、角色和权限
- char 与 string 区别
- ASP.net项目创建
- 小试Googletest记一
- Codeforces 779B-Weird Rounding