【数据结构与算法 | 栈篇】力扣155

1. 力扣155 : 最小栈

(1). 题

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

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

示例 1:

复制代码
输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

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

提示:

  • -231 <= val <= 231 - 1
  • poptopgetMin 操作总是在 非空栈 上调用
  • push, pop, top, and getMin最多被调用 3 * 104

(2). 思路1

使用了双端队列和动态数组ArrayList. 每次队列push一个元素,也将该元素add进数组中. 利用Collections工具类的静态方法来求解栈中最小的元素.

(3). 解1

java 复制代码
class MinStack {
    Deque<Integer> deque;
    List<Integer> list;
    public MinStack() {
        deque = new LinkedList<>();
        list = new ArrayList<>();
    }
    
    public void push(int val) {
        deque.push(val);
        list.add(val);
    }
    
    public void pop() {
        int val = deque.pop();
        list.remove(Integer.valueOf(val));
    }
    
    public int top() {
        return deque.peek();
    }
    
    public int getMin() {
        return Collections.min(list);
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

(4). 思路2

使用双端队列和优先队列来解决. 比较好的一点是优先队列每次将优先级最高的元素出列.在该题中即每次将队列中最小的元素出列.当pop元素时,即从优先级队列中将该元素移除remove出去.

(5). 解2

java 复制代码
class MinStack {
    Deque<Integer> deque;
    PriorityQueue<Integer> pq;
    public MinStack() {
        deque = new LinkedList<>();
        pq = new PriorityQueue<>();
    }
    
    public void push(int val) {
        deque.push(val);
        pq.offer(val);
    }
    
    public void pop() {
        int val = deque.pop();
        pq.remove(val);
    }
    
    public int top() {
        return deque.peek();
    }
    
    public int getMin() {
        int val = pq.poll();
        pq.offer(val);
        return val;
    }
}
相关推荐
雾里看山38 分钟前
顺序表VS单链表VS带头双向循环链表
数据结构·链表
大千AI助手3 小时前
DTW模版匹配:弹性对齐的时间序列相似度度量算法
人工智能·算法·机器学习·数据挖掘·模版匹配·dtw模版匹配
好好研究3 小时前
学习栈和队列的插入和删除操作
数据结构·学习
YuTaoShao4 小时前
【LeetCode 热题 100】48. 旋转图像——转置+水平翻转
java·算法·leetcode·职场和发展
生态遥感监测笔记4 小时前
GEE利用已有土地利用数据选取样本点并进行分类
人工智能·算法·机器学习·分类·数据挖掘
Tony沈哲5 小时前
macOS 上为 Compose Desktop 构建跨架构图像处理 dylib:OpenCV + libraw + libheif 实践指南
opencv·算法
刘海东刘海东5 小时前
结构型智能科技的关键可行性——信息型智能向结构型智能的转变(修改提纲)
人工智能·算法·机器学习
pumpkin845146 小时前
Rust 调用 C 函数的 FFI
c语言·算法·rust
挺菜的6 小时前
【算法刷题记录(简单题)003】统计大写字母个数(java代码实现)
java·数据结构·算法