【数据结构与算法 | 栈篇】力扣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;
    }
}
相关推荐
‘’林花谢了春红‘’27 分钟前
C++ list (链表)容器
c++·链表·list
搬砖的小码农_Sky2 小时前
C语言:数组
c语言·数据结构
Swift社区3 小时前
LeetCode - #139 单词拆分
算法·leetcode·职场和发展
Kent_J_Truman3 小时前
greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用
算法
先鱼鲨生4 小时前
数据结构——栈、队列
数据结构
一念之坤4 小时前
零基础学Python之数据结构 -- 01篇
数据结构·python
IT 青年4 小时前
数据结构 (1)基本概念和术语
数据结构·算法
熬夜学编程的小王4 小时前
【初阶数据结构篇】双向链表的实现(赋源码)
数据结构·c++·链表·双向链表
Dong雨4 小时前
力扣hot100-->栈/单调栈
算法·leetcode·职场和发展
SoraLuna4 小时前
「Mac玩转仓颉内测版24」基础篇4 - 浮点类型详解
开发语言·算法·macos·cangjie