算法-最小栈-LeetCode155

题目

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

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

思路

  • 最先的思路是使用 List 作为模拟栈的容器,通过使用 index 角标记录入栈出栈的位置,每次栈元素变化重新定位最小值 min,代码提交执行9ms
  • 题解最快是使用双向链表做,看一下思路,确实快,原因在于节点按顺序存储了当前值与最小值,每次入栈出栈操后不涉及额外的定位最小值,示意 node(当前值,最小值)node(1,1)->node(2,1)->node(-1,-1)->node(-2,-2)

关键

node节点既存储当前值,又存储最小值,最小值随链表有序递减

代码

package leetcode.stack;

import java.util.ArrayList;
import java.util.List;

/**
 * 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
 * <p>
 * push(x) -- 将元素 x 推入栈中。
 * pop() -- 删除栈顶的元素。
 * top() -- 获取栈顶元素。
 * getMin() -- 检索栈中的最小元素。
 * <p>
 * 示例:
 * MinStack minStack = new MinStack();
 * minStack.push(-2);
 * minStack.push(0);
 * minStack.push(-3);
 * minStack.getMin();   --> 返回 -3.
 * minStack.pop();
 * minStack.top();      --> 返回 0.
 * minStack.getMin();   --> 返回 -2.
 */

class Node {
    public Node pre;
    public Node next;
    public int value;
    public int min;
}

class MinStack2 {

    Node top = null;

    /**
     * initialize your data structure here.
     */
    public MinStack2() {

    }

    public void push(int x) {
        Node node = new Node();
        node.value = x;
        if (top == null) {
            node.min = x;
        } else {
            if (top.min < x) {
                node.min = top.min;
            } else {
                node.min = x;
            }
        }
        node.pre = top;
        top = node;
    }

    /**
     * top永远指向栈顶
     * 第一个 if 判断栈是不是已经空了,空栈就没有pre节点
     * 第二个 if 判断栈是不是已经空了,不是空栈就删除next节点,断链
     */
    public void pop() {
        if (null != top) {
            top = top.pre;
            if (null != top) {
                top.next = null;
            }
        }
    }

    public int top() {
        if (null != top) {
            return top.value;
        } else {
            return -1;
        }
    }

    public int getMin() {
        return top.min;
    }
}


public class N155_2 {
    public static void main(String[] args) {
        MinStack2 minStack = new MinStack2();
        minStack.push(2147483646);
        minStack.push(2147483646);
        minStack.push(2147483647);
        System.out.println(minStack.top());
        minStack.pop();
        System.out.println(minStack.getMin());
        minStack.pop();
        System.out.println(minStack.getMin());
        minStack.pop();
        minStack.push(2147483647);
        System.out.println(minStack.top());
        System.out.println(minStack.getMin());
        minStack.push(-2147483648);
        System.out.println(minStack.top());
        System.out.println(minStack.getMin());
        minStack.pop();
        System.out.println(minStack.getMin());
    }
}

7 声望
3 粉丝
0 条评论
推荐阅读
Liquibase 数据库版本管理工具:3. changeSet 变更集详解
上篇文章中详细了介绍了一下changelog 文件的使用,本篇文章将详细说一下 changeSet 变更集 中的细节,以及通常的使用方式 1.变更集分类 changeSet 分为 6类: add create drop rename sql other 官方文档:[链接...

哒哒队长1阅读 4k评论 1

与RabbitMQ有关的一些知识
工作中用过一段时间的Kafka,不过主要还是RabbitMQ用的多一些。今天主要来讲讲与RabbitMQ相关的一些知识。一些基本概念,以及实际使用场景及一些注意事项。

lpe2348阅读 1.8k

封面图
Git操作不规范,战友提刀来相见!
年终奖都没了,还要扣我绩效,门都没有,哈哈。这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。问题描述小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开...

王中阳Go5阅读 2k评论 2

封面图
Redis 发布订阅模式:原理拆解并实现一个消息队列
“65 哥,如果你交了个漂亮小姐姐做女朋友,你会通过什么方式将这个消息广而告之给你的微信好友?““那不得拍点女朋友的美照 + 亲密照弄一个九宫格图文消息在朋友圈发布大肆宣传,暴击单身狗。”像这种 65 哥通过朋...

码哥字节6阅读 1.3k

封面图
万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide3阅读 221

封面图
NB的Github项目,看到最后一个我惊呆了!
最近看到不少好玩的、实用的 Github 项目,就来给大家推荐一把。中国制霸生成器最近在朋友圈非常火的一个小网站,可以在线标记 居住、短居、游玩、出差、路过 标记后可生成图片进行社区分享,标记过的信息会记录...

艾小仙5阅读 1.6k评论 1

PHP转Go实践:xjson解析神器「开源工具集」
我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。

王中阳Go4阅读 1.3k评论 2

封面图
7 声望
3 粉丝
宣传栏