js 包含min函数的栈_包含min函数的栈

题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

思路一:不改变原栈的顺序,时间复杂度为O(n)

idea:本题需要重新自定义push,pop,top,min方法,使得能够通过min方法随时得到当前栈中的最小元素。

首先如果我们不考虑这是一个栈,而是一个普通的数组,那么就很简单,我们只需要定义一个数minNumber存储当前数组中的最小值。遍历整个数组,如果当前数小于最小值min,那么就更新最小值,否则就继续遍历。

那么我们能不能将这种思想转换到栈中呢?首先我们必须清楚栈的特点:“先进后出,后进先出”。如果我们依次将栈中的元素弹出来和minNumber比较,如果小于最小值minNumber,就更新minNumber,否则就继续弹出。这种思想事实上是可以借鉴的。但是有个问题是当我们把最小值找到了,但是这个时候栈也空了。所以我们就需要一个辅助栈来暂时存储弹出来的数,将栈里面的数弹空了,最小值也找到了,那么就将辅助栈里面的数又重新压入原来的栈中。这样两次出栈和入栈的过程也不会改变原来栈中的顺序。

bb11f3263465a583d33c2ad749aac980.png

import java.util.Stack;

public class Solution {

//创建两个栈对象,一个用于存储原栈数据,一个用于暂时辅助存储数据

Stack stack = new Stack();

Stack subStack = new Stack();

public void push(int node) {

stack.push(node);

}

//pop操返回栈顶元素的同时会remove栈顶元素

public void pop() {

int p = stack.pop();

}

//这里返回栈的顶部元素,但是不会remove栈顶元素

public int top() {

int topNumber = stack.peek();

return topNumber;

}

public int min() {

int minNumber = Integer.MAX_VALUE;

//依次取出栈里面的数直到栈为空

while(stack.isEmpty() != true){

//得到栈顶元素

int number = stack.pop();

if(minNumber > number){

minNumber = number;

}

//弹出一个,压入一个

subStack.push(number);

}

//最后将辅助栈中的元素再重新压入原来的栈里

while(subStack.isEmpty() != true){

stack.push(subStack.pop())

}

return minNumber;

}

}

思路二

利用辅助栈存储栈中对应元素的最小值,使得辅助栈的栈顶永远是最小值,从而可以以o(1)的时间复杂度获取到最小值

3d35db38e26d51ad352a92fea3fd4c58.png

package code;

import javax.activation.MailcapCommandMap;

import java.util.Stack;

public class Stacke1 {

Stack stack = new Stack();

Stack subStack = new Stack();

public void push(int node) {

stack.push(node);

//这里的短路或不能调换位置

if(subStack.isEmpty() || node < (int)subStack.peek()){

subStack.push(node);

} else {

subStack.push(subStack.peek());

}

}

public void pop() {

stack.pop();

subStack.pop();

}

public int top() {

return (int) stack.peek();

}

public int min() {

return (int)subStack.peek();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值