Leetcode 解题模版 - Stack

Stack

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

题外话:动态规划 Dynamic Programming

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

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

Stack Principle

定义好Stack的含义

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

例题

  1. Daily Temperature

Given an array of integers temperatures represents the daily temperatures, return an array answer such that answeri 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 arri

Stack Definition: All elements(index) to the right of arri that are greater than arri (monotone increasing stack)

Top of Stack: Next Greater element to the right of arri

High Level Idea:

  1. Initialize the stack

  2. For each element arri backwards (pop until stack is empty or top of stack > arri)

  3. Calculate the distance from arri to top of the stack

  4. Repeat

    class Solution { public int\[\] dailyTemperatures(int\[\] temperatures) { int n = temperatures.length; int\[\] res = new intn; Deque stack = new ArrayDeque<>(n); for(int i = n - 1; i >=0; i--) { while(!stack.isEmpty() && temperaturesi >= temperaturesstack.peek()) { stack.pop(); } if(stack.isEmpty()) { resi = 0; } else { resi = 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 arri

High Level Idea:

  1. Initialize Stack
  2. For each arri:

a. if arri > 0, push to stack

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

c. special dealing with "equal"

d. push arri 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)

相关推荐
A boy CDEF girl8 小时前
算法题专栏:优选算法
数据结构·算法·leetcode
没落之王8 小时前
三易五行看宋朝的三界确立
大数据·人工智能·算法
wuminyu9 小时前
Java字节码学习总结:字节码如何加载、解析和执行
java·linux·c语言·jvm·c++
坤坤子吖9 小时前
算法学习——单调队列
开发语言·c++·笔记·学习·算法
Flynn Liang9 小时前
大模型怎么自己调函数?Spring AI 2.0 Tool Calling 自动循环原理 + 完整时序图
java·人工智能·spring·agent·函数调用·springai·toolcalling
乌暮10 小时前
请求进门先安检:Spring 拦截器与统一功能实战指南
java·开发语言·后端·学习·spring
学长毕设10 小时前
基于SpringBoot的烘焙商品商品系统-附源码
java·spring boot·后端
Js.Tx10 小时前
【具体数学 Concrete Mathematics】2.1.5 一般性的方法
算法·具体数学
金銀銅鐵11 小时前
[Java] 用纯 Swing 做一个《論語·學而》阅读器
java·ai编程·交互设计
艾伦_耶格宇12 小时前
【kubernetes - 1.28版本】-11 K8S核心组件
java·容器·kubernetes