第 1 日:包含min函数的栈
题目链接:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/
题目
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
提示:
各函数的调用总次数不超过 20000 次
解题
-
使用链表实现栈
大致思路:
定义一个结点,每次入栈就采用头插法,出栈就取出头结点,再将head指向下一个结点。
基本操作已经解决了,那这个如何求当前链表的min(最小值)呢?
这时Node中min属性就来作用了,每次入栈就将本身元素值和上一个结点最小值作比较,如果比最小值小,则更新本结点的min值。这样重返往复下去,每个结点中min值就是指的是从当前结点开始到尾结点的最小值。
详细代码如下:
class MinStack { private Node head; public MinStack() { } public void push(int x) { if (head == null) head = new Node(x, x, null); else head = new Node(x, Math.min(head.min, x), head); } public void pop() { head = head.next; } public int top() { return head.val; } public int min() { return head.min; } private class Node { int val; int min;//存放当前结点之前的最小元素 Node next; public Node(int val, int min, Node next) { this.val = val; this.min = min; this.next = next; } } }