力扣155.最小栈 & 剑指offer 20.包含min 函数的栈

力扣155.最小栈 & 剑指offer 20.包含min 函数的栈

题目描述

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

注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。

思路:

    1.  定义两个栈,一个 stack1 栈用于存储栈的元素,另一个 stack2 栈用来存储当前stack1的栈顶元素对应的最小的元素,构造函数stack2压入一个Integer.MAX_VALUE
    2. 每当push 一个元素,把当前元素和栈2的栈顶元素比较,把较小者压入栈2, 需要存储的元素压入栈一,这样两个栈的栈顶元素分别是我们存储的值和当前的最小值
    3. 每当pop 一个元素,同时pop stack2 中的一个元素

 4. top()函数返回stack的栈顶值,min()函数返回 stack2 的栈顶值

 1 class MinStack {
 2     Stack<Integer> stack1 = new Stack<Integer>();
 3     Stack<Integer> stack2 = new Stack<Integer>();
 4     // int min = Integer.MAX_VALUE;
 5 
 6     /** initialize your data structure here. */
 7     public MinStack() {
 8         stack2.push(Integer.MAX_VALUE); // 把int类型的最大值压入栈2
 9     }
10     
11     public void push(int x) {
12         // 把当前元素和栈2的栈顶元素比较,把较小者压入栈2, 需要存储的元素压入栈一
13         int min = Math.min(x, stack2.peek());
14        
15         stack1.push(x);
16         stack2.push(min);
17     }
18     
19     public void pop() {
20         // 出栈的时候两个栈同时出栈
21         if(!stack1.empty()){
22             stack1.pop();
23             stack2.pop();
24         }
25     }
26     
27     public int top() {
28         if(!stack1.empty()){
29             return stack1.peek();
30         }
31         return 0;
32     }
33     
34     public int getMin() {
35         if(!stack2.empty()){
36             return stack2.peek();
37         }
38         return 0;
39     }
40 }

力扣测试时间为9ms, 空间为41.4MB

复杂度分析:

时间复杂度:获取最小值的时间复杂度为O(1)

空间复杂度:需要两个栈,所以空间复杂度为O(n)

原文地址:https://www.cnblogs.com/hi3254014978/p/12584486.html