30_剑指offer_java_包含min函数的栈

目录

题目描述

测试用例

题目考点

解题思路

参考解题


题目描述

 

定义栈的数据,请在该类型中实现一个能够找到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)

 

测试用例

 

  • 新压入栈的数字比之前的最小值大。
  • 新压入栈的数字比之前的最小值小。
  • 弹出栈的数字不是最小元素。
  • 弹出栈的数字是最小元素。

 

题目考点

 

  • 考察应聘者分析复杂问题的思维能力——举例分析。
  • 考察应聘者对栈的理解。
  • 栈:先入后出、后入先出

 

解题思路

 

这里只限制了时间复杂度,没限制空间复杂度,我们可能会想到用辅助栈空间角度)。

如表格所示,使用辅助栈,每次把当前栈的最小值压入辅助栈,保证辅助栈的栈顶一直为最小元素。当最小元素从数据栈中弹出,同时弹出辅助栈中的栈顶元素,此时辅助栈的栈顶元素就是下一个栈的最小值。

具体功能函数:push、pop、min

1、min取辅助栈栈顶元素;

2、push:如果压入的元素比当前最小值小则压入辅助栈,不然辅助栈再压入一个当前最小值(为了pop的方便);

3、pop:直接弹出数据栈与辅助栈的栈顶元素。

数据栈、辅助栈、最小值状态分析
步骤操作数据栈辅助栈(每次把当前栈的最小值压入)最小值(辅助栈栈顶)
1压入3333
2压入43,43,33
3压入23,4,23,3,22
4压入13,4,2,13,3,2,11
5弹出3,4,23,3,22
6弹出3,43,33
7压入03,4,03,3,00

时间复杂度:o(1)

参考解题

import java.util.Stack;

public class Solution {

    // 数据栈
    Stack<Integer> dataStack = new Stack<>();
    // 辅助栈
    Stack<Integer> minStack = new Stack<>();
    
    public void push(int node) {
        // 如果压入的元素比当前最小值小则压入辅助栈,
        // 不然辅助栈再压入一个当前最小值(为了pop的方便);
        dataStack.push(node);
        if(minStack.empty() || node < minStack.peek()){ //empty,true当且仅当此堆栈不包含项目时; 
            minStack.push(node);
        }else{
            minStack.push(minStack.peek());
        }
    }
    
    public void pop() {
        // 直接弹出数据栈与辅助栈的栈顶元素。
        dataStack.pop();
        minStack.pop();
    }
    
    public int top() {
        return dataStack.peek();
    }
    
    public int min() {
        // 取辅助栈栈顶元素
        return minStack.peek();
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值