LeetCode 剑指 Offer 30. 包含min函数的栈

题目描述

剑指 Offer 30. 包含min函数的栈

image-20241107205549934

思路分析

解法一:辅助最小栈(推荐)

核心思路

  • 主栈保存正常元素。
  • 辅助栈保存当前最小值,当压入元素小于等于最小值时同步入栈。
  • 弹栈时若弹出元素等于当前最小值,同步弹出辅助栈。

复杂度分析

  • 时间复杂度:O(1),每个操作均为常数时间。
  • 空间复杂度:O(n),辅助栈最多保存 n 个元素。
class MinStack {
    private final Deque<Integer> data;
    private final Deque<Integer> mins;

    public MinStack() {
        data = new ArrayDeque<>();
        mins = new ArrayDeque<>();
    }

    public void push(int x) {
        data.push(x);

        if (mins.isEmpty() || x <= mins.peek()) {
            mins.push(x);
        }
    }

    public void pop() {
        int val = data.pop();
        if (val == mins.peek()) {
            mins.pop();
        }
    }

    public int top() {
        return data.peek();
    }

    public int min() {
        return mins.peek();
    }
}
type MinStack struct {
	data []int
	mins []int
}

func Constructor() MinStack {
	return MinStack{
		data: make([]int, 0),
		mins: make([]int, 0),
	}
}

func (s *MinStack) Push(x int) {
	s.data = append(s.data, x)

	if len(s.mins) == 0 || x <= s.mins[len(s.mins)-1] {
		s.mins = append(s.mins, x)
	}
}

func (s *MinStack) Pop() {
	n := len(s.data)
	val := s.data[n-1]
	s.data = s.data[:n-1]

	if val == s.mins[len(s.mins)-1] {
		s.mins = s.mins[:len(s.mins)-1]
	}
}

func (s *MinStack) Top() int {
	return s.data[len(s.data)-1]
}

func (s *MinStack) Min() int {
	return s.mins[len(s.mins)-1]
}

相似题目

题目 难度 考察点
155. 最小栈 简单
232. 用栈实现队列 简单
225. 用队列实现栈 简单
739. 每日温度 中等 单调栈
496. 下一个更大元素 I 简单 单调栈
本文作者:
本文链接: https://hgnulb.github.io/blog/2021/42894963
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!