剑指:包含min函数的栈(min栈)
题目描述
设计一个支持 push,pop,top 等操作并且可以在 O(1) 时间内检索出最小元素的堆栈。
- push(x)–将元素x插入栈中
- pop()–移除栈顶元素
- top()–得到栈顶元素
- getMin()–得到栈中最小元素
样例
MinStack minStack = new MinStack();
minStack.push(-1);
minStack.push(3);
minStack.push(-4);
minStack.getMin(); --> Returns -4.
minStack.pop();
minStack.top(); --> Returns 3.
minStack.getMin(); --> Returns -1.
解法
定义两个stack,一个为存放最小数的序列的辅助栈。
压栈时,先将元素 x 压入 stack1。然后判断 stack2 的情况:
stack2栈为空或者栈顶元素大于x,则将x压入stack2中。stack2栈不为空且栈定元素小于x,则重复压入栈顶元素。
获取最小元素时,从 stack2 中获取栈顶元素即可。
import java.util.Stack;
public class MinStack {
private Stack<Integer> stack1;
private Stack<Integer> stack2;
public MinStack(){
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void push(int x){
stack1.push(x);
if(stack2.isEmpty() || stack2.peek()>x)
stack2.push(x);
else
stack2.push(stack2.peek());
}
public void pop(){
stack1.pop();
stack2.pop();
}
public int top(){
return stack1.peek();
}
public int getMin(){
return stack2.peek();
}
}
public static void main(String[] args) {
MinStack obj = new MinStack();
obj.push(-1);
obj.push(3);
obj.push(-4);
obj.push(0);
obj.pop();
int param_3 = obj.top();
int param_4 = obj.getMin();
System.out.println(param_3+ " "+param_4);
}
时间复杂度:O(1)、空间复杂度:O(n)
优化
时间复杂度:O(1)、空间复杂度:O(1)
package com.lisen;
import java.util.Stack; public class MinStack {
private Stack<Integer> stack;
private int min; public MinStack(){
stack = new Stack<>();
} public void push(int x){
if(stack.isEmpty()){
min = x;
stack.push(0);
}else{
//计算差值
int compareVal = x - min;
stack.push(compareVal);
min = compareVal < 0 ? x : min;
}
} public void pop(){
int top = stack.peek();
//如果top小于0,显然最小值也一并被删除,此时更新最小值
min = top < 0 ? (min-top) : min;
stack.pop();
} public int getMin(){
return min;
}
}
此方法在数据有限制的情况下适用,否则差值会溢出
剑指:包含min函数的栈(min栈)的更多相关文章
- 剑指Offer(二十一):栈的压入、弹出序列
剑指Offer(二十一):栈的压入.弹出序列 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...
- 剑指offer-面试题7:俩个栈实现队列(c)
- 剑指offer-面试题7:俩个栈实现队列(java)
详细分析请参照C语言版,这里仅仅给出实现代码,注释很详细,不得不说java各种api用起来真是爽飞了 1 package com.xsf.SordForOffer; 2 3 import java.u ...
- 牛客网剑指offer第21题——判断出栈序列是否是入栈序列
题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...
- 《剑指offer》— JavaScript(21)栈的压入、弹出序列
栈的压入.弹出序列 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5, ...
- 自定义栈类型,具有找到站内最小元素的min函数 ,且min(),pop(),push()函数的时间复杂度为O(1)
基本思想: // 借助一个辅助栈,入栈时,若新元素比辅助栈栈顶元素小,则直接放入辅助站 // 反之,辅助站中放入次小元素(即辅助栈栈顶元素)====保证最小元素出栈时,次小元素被保存 static c ...
- 剑指offter-面试题7.用两个栈实现队列
题目.用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead 分别完成在对尾插入节点和在队头删除节点. 该队列类模板如下: template <typ ...
- 【剑指 Offer】09.用两个栈实现队列
题目描述 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead , 分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,del ...
- 【剑指Offer】09. 用两个栈实现队列 解题报告(python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 一个栈用来保存输入,一个栈用来输出 日 ...
- 剑指Offer系列_09_用两个栈实现队列
package leetcode.sword_to_offfer.day01; import java.util.LinkedList; /** * 用两个栈实现一个队列.队列的声明如下,请实现它的两 ...
随机推荐
- djang小项目过程中的小问题 02(跳转界面)
我觉着自己生下来就是解决问题的 ##1. 今天在使用登录注册模板时,输入后缀index,正常显示登录界面,但是点击 立即注册 之后不会跳转到注册页面 因为我观察到后缀名发生变化了,但是出发点是错的,前 ...
- 利用Tengine在树莓派上跑深度学习网络
树莓派是国内比较流行的一款卡片式计算机,但是受限于其硬件配置,用树莓派玩深度学习似乎有些艰难.最近OPENAI为嵌入式设备推出了一款AI框架Tengine,其对于配置的要求相比传统框架降低了很多,我尝 ...
- Push to origin/master was rejected
在IDEA中往码云上传项目的时候出现了如下的错误:Push to origin/master was rejected 因为我是把代码上传到一个新的仓库里面,所以第一次提交的时候和仓库里面的东西不同步 ...
- [Python] Python 模拟登录,并请求
Python 模拟登录,并请求 # encoding: utf- import requests import socket import time socket.setdefaulttimeout( ...
- [LeetCode] 454. 4Sum II 四数之和之二
Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such t ...
- ORACLE--10G安装问题( error while loading shared libraries)
01,问题描述 问题一: WARNING: directory '/u01/app/oracle/product/10.2.0' is not owned by root WARNING: direc ...
- C# socket ipv6初体验
Server: serverSocket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp) ...
- xcode打包签名访问失败errSecInternalComponent
错误信息 /Users/xxxx/Library/Developer/Xcode/DerivedData/Unity-iPhone-bzwyypshqjwshtbpohwldjmqkstx/Build ...
- nodejs搭建web服务教程
nodejs搭建web服务教程 先安装nodejs 然后 命令node js文件 即可开启服务了 输出如下 Magic happens on port 9011 你查看端口可以看到tcp 0 0 :: ...
- Android系统HAL开发实例
1.前言 Android系统使用HAL这种设计模式,使得上层服务与底层硬件之间的耦合度降低,在文件: AOSP/hardware/libhardware/include/hardware/hardwa ...