Leetcode:155. 最小栈

Leetcode:155. 最小栈

题目描述

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。

push(x) -- 将元素 x 推入栈中。
pop() -- 删除栈顶的元素。
top() -- 获取栈顶元素。
getMin() -- 检索栈中的最小元素。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

思路

思路1

主要还是栈,只是在栈的基础上获取栈中最小值,所以可以直接构建一个辅助栈,每次入栈时都记录当前位置下栈的最小数,出栈时只需要一起出即可

代码

代码1

class MinStack {

    /** initialize your data structure here. */
    private Stack stack;
    private Stack stackHelper;
    
    public MinStack() {
        stack = new Stack<>();
        stackHelper = new Stack<>();
    }
    
    public void push(int x) {
        stack.add(x);
        if (stackHelper.isEmpty() || x < stackHelper.peek()){
            stackHelper.add(x);
        }else {
            stackHelper.add(stackHelper.peek());
        }
    }
    
    public void pop() {
        if (!stack.isEmpty()){
            stack.pop();
            stackHelper.pop();
        } else {
            throw new RuntimeException("Stack is empty!");
        }
    }
    
    public int top() {
        if (!stack.isEmpty()){
            return stack.peek();
        } else {
            throw new RuntimeException("Stack is empty!");
        }
    }
    
    public int getMin() {
        if (!stackHelper.isEmpty()){
            return stackHelper.peek();
        } else {
            throw new RuntimeException("Stack is empty!");
        }
    }
}

复杂度分析

思路1时间复杂度

$O(1)$

思路1空间复杂度

$O(n)$


文章作者: 小风雷
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小风雷 !
评论
 上一篇
Leetcode:215. 数组中的第K个最大元素 Leetcode:215. 数组中的第K个最大元素
215. 数组中的第K个最大元素题目描述在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例 1:输入: [3,2,1,5,6,4] 和 k = 2 输出: 5
2020-03-29
下一篇 
Leetcode:238. 除自身以外数组的乘积 Leetcode:238. 除自身以外数组的乘积
Leetcode: 238. 除自身以外数组的乘积题目描述给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
2020-03-28
  目录