Leetcode 解题模版 - Stack

Stack

  • 特性:LIFO (Last In First Out)
  • 适用于需要记录之前的状态,必要的时候可以回到之前的状态,或者利用之前的值
  • 不像array,不能用index访问,只能每次拿栈顶元素

题外话:动态规划 Dynamic Programming

DP: 记录之前所有状态,随时可以访问任何一个子问题,所以通常用Array或者HashTable,而且不会回到之前的状态,只会利用之前的值

Stack:每次只需要栈顶元素,并且每个状态只会被用O(1)次

Stack Principle

定义好Stack的含义

  • 在arr[i]左侧所有比arr[i]大的数
  • 递归之前的函数状态(Call Stack)

例题

  1. Daily Temperature

Given an array of integers temperatures represents the daily temperatures, return an array answer such that answer[i] is the number of days you have to wait after the ith day to get a warmer temperature. If there is no future day for which this is possible, keep answer[i] == 0 instead.

Example 1:

ini 复制代码
Input: temperatures = [73,74,75,71,69,72,76,73]
Output: [1,1,4,2,1,1,0,0]

Example 2:

ini 复制代码
Input: temperatures = [30,40,50,60]
Output: [1,1,1,0]

Example 3:

ini 复制代码
Input: temperatures = [30,60,90]
Output: [1,1,0]

Constraints:

  • 1 <= temperatures.length <= 105
  • 30 <= temperatures[i] <= 100

Solution:

Find the distance to the next greater element for each arr[i]

Stack Definition: All elements(index) to the right of arr[i] that are greater than arr[i] (monotone increasing stack)

Top of Stack: Next Greater element to the right of arr[i]

High Level Idea:

  1. Initialize the stack

  2. For each element arr[i] backwards (pop until stack is empty or top of stack > arr[i])

  3. Calculate the distance from arr[i] to top of the stack

  4. Repeat

    class Solution { public int[] dailyTemperatures(int[] temperatures) { int n = temperatures.length; int[] res = new int[n]; Deque stack = new ArrayDeque<>(n); for(int i = n - 1; i >=0; i--) { while(!stack.isEmpty() && temperatures[i] >= temperatures[stack.peek()]) { stack.pop(); } if(stack.isEmpty()) { res[i] = 0; } else { res[i] = stack.peek() - i; } stack.push(i); } return res; }}

  5. Asteroid Collision

We are given an array asteroids of integers representing asteroids in a row.

For each asteroid, the absolute value represents its size, and the sign represents its direction (positive meaning right, negative meaning left). Each asteroid moves at the same speed.

Find out the state of the asteroids after all collisions. If two asteroids meet, the smaller one will explode. If both are the same size, both will explode. Two asteroids moving in the same direction will never meet.

Example 1:

ini 复制代码
Input: asteroids = [5,10,-5]
Output: [5,10]
Explanation: The 10 and -5 collide resulting in 10. The 5 and 10 never collide.

Example 2:

vbnet 复制代码
Input: asteroids = [8,-8]
Output: []
Explanation: The 8 and -8 collide exploding each other.

Example 3:

ini 复制代码
Input: asteroids = [10,2,-5]
Output: [10]
Explanation: The 2 and -5 collide resulting in -5. The 10 and -5 collide resulting in 10.

Constraints:

  • 2 <= asteroids.length <= 104
  • -1000 <= asteroids[i] <= 1000
  • asteroids[i] != 0

Solution:

Stack Definition: All asteroid left so far

Top of Stack: Closest survived asteroid to the left of arr[i]

High Level Idea:

  1. Initialize Stack
  2. For each arr[i]:

a. if arr[i] > 0, push to stack

b. else keep popping "smaller" until stack is empty or top element < 0

c. special dealing with "equal"

d. push arr[i] to stack if survived

scss 复制代码
class Solution {    public int[] asteroidCollision(int[] asteroids) {        Deque<Integer> stack = new ArrayDeque<>();        for(int ast : asteroids) {            if(ast > 0) {                stack.push(ast);            } else {                while(!stack.isEmpty() && stack.peek() > 0 && stack.peek() < - ast) {                    stack.pop();                }                if(!stack.isEmpty() && stack.peek() == -ast) {                    stack.pop();                } else if(stack.isEmpty() || stack.peek() < 0) {                    stack.push(ast);                }            }        }        int[] res = new int[stack.size()];        for(int i = res.length - 1; i >=0; i--) {            res[i] = stack.pop();        }        return res;    }}

时间复杂度:O(n)

相关推荐
RTC老炮4 分钟前
音视频FEC前向纠错算法Reed-Solomon原理分析
网络·算法·架构·音视频·webrtc
郝学胜-神的一滴7 分钟前
系统设计:新鲜事系统扩展与优化
java·python·职场和发展·php·软件工程·软件构建
噜噜噜噜鲁先森7 分钟前
STL——String类
开发语言·c++·算法
爱吃烤鸡翅的酸菜鱼8 分钟前
Maven中BOM(Bill of Materials)的使用详解
java·中间件·maven·源代码管理
Severus_black8 分钟前
算法题C——用队列实现栈/用栈实现队列
c语言·数据结构·算法·链表
谭欣辰12 分钟前
详细讲解 C++ 有向无环图(DAG)及拓扑排序
c++·算法·图论
XS03010613 分钟前
Java 基础(七)多态
java·开发语言
不知名的老吴15 分钟前
一文读懂:单例模式的经典案例分析
java·开发语言·单例模式
承渊政道17 分钟前
【递归、搜索与回溯算法】(掌握记忆化搜索的核心套路)
数据结构·c++·算法·leetcode·macos·动态规划·宽度优先
闻缺陷则喜何志丹20 分钟前
【 线性筛 调和级数】P7281 [COCI 2020/2021 #4] Vepar|普及+
c++·算法·洛谷·线性筛·调和级数