[英雄星球七月集训LeetCode解题日报] 第14日 栈

[英雄星球七月集训LeetCode解题日报] 第14日 栈

    • 日报
    • 题目
      • 一、 1614. 括号的最大嵌套深度
        • 1. 题目描述
        • 2. 思路分析
        • 3. 代码实现
      • 二、 剑指 Offer 06. 从尾到头打印链表
        • 1. 题目描述
        • 2. 思路分析
        • 3. 代码实现
      • 三、 1381. 设计一个支持增量操作的栈
        • 1. 题目描述
        • 2. 思路分析
        • 3. 代码实现
      • 四、 1441. 用栈操作构建数组
        • 1. 题目描述
        • 2. 思路分析
        • 3. 代码实现

日报

题目

一、 1614. 括号的最大嵌套深度

链接: 1614. 括号的最大嵌套深度

1. 题目描述

[英雄星球七月集训LeetCode解题日报] 第14日 栈_第1张图片

2. 思路分析
  • 因为题目给的必是合法串,那用栈判断最多有几个未被关闭的’('即可。
3. 代码实现
class Solution:
    def maxDepth(self, s: str) -> int:
        stack = 0
        ans = 0
        for c in s:
            if c == '(':
                stack += 1
                ans = max(ans,stack)
            elif c == ')':
                stack -= 1
        return ans

二、 剑指 Offer 06. 从尾到头打印链表

链接: 剑指 Offer 06. 从尾到头打印链表

1. 题目描述

[英雄星球七月集训LeetCode解题日报] 第14日 栈_第2张图片

2. 思路分析
  • 看到题目第一时间想递归,发现数据范围是一万会爆深度。
  • 那用栈存一下再出来就行,出的时候发现得返回数组,那干脆逆序了,出个p。
3. 代码实现
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reversePrint(self, head: ListNode) -> List[int]:
        stack = []
        while head:
            stack.append(head.val)
            head = head.next 
        return list(reversed(stack))
            

三、 1381. 设计一个支持增量操作的栈

链接: 1381. 设计一个支持增量操作的栈

1. 题目描述

[英雄星球七月集训LeetCode解题日报] 第14日 栈_第3张图片

2. 思路分析
  • 这题是区间更新,第一时间想到线段树lazytag、树状数组差分等优化。
  • 然后是个栈,因此我们可以借用差分思想来优化。
  • 由于必增量前缀k一段,因此只需要声明第k-1个元素比后一个大了val,那么这个操作就是O(1)的。
  • 用一个辅助差分数组diff[]来记录这个差分,pop的时候检查栈顶元素的差分值,如果有就一起pop,并传递给top-1即可。
3. 代码实现
class CustomStack:

    def __init__(self, maxSize: int):
        self.max_size = maxSize
        self.diff = [0]*1005
        self.stack = []


    def push(self, x: int) -> None:
        if len(self.stack) >= self.max_size:
            return
        self.stack.append(x)



    def pop(self) -> int:
        stack = self.stack
        if not stack:
            return -1
        top = len(stack)-1
        if self.diff[top]:
            stack[-1] += self.diff[top]
            if top-1>=0:
                self.diff[top-1] += self.diff[top]
            self.diff[top] = 0
            
        return stack.pop()


    def increment(self, k: int, val: int) -> None:
        self.diff[min(k-1,len(self.stack)-1)] += val



# Your CustomStack object will be instantiated and called as such:
# obj = CustomStack(maxSize)
# obj.push(x)
# param_2 = obj.pop()
# obj.increment(k,val)

四、 1441. 用栈操作构建数组

链接: 1441. 用栈操作构建数组

1. 题目描述

[英雄星球七月集训LeetCode解题日报] 第14日 栈_第4张图片

2. 思路分析

从list视角看:

  • 每个数字如果不存在,一定是先push再pop。
  • 如果存在一定是只push没pop。
    从target视角看:
  • 如果target[i]和target[i+1]之间空了k个位置,那这之间一定是先push且pop了k次。
  • 如果target[i]和target[i+1]是连续的,即target[i]+1=target[i+1],那么他们都是指有push。
  • 因此只需要检查和前一个的差值,增加push,pop的个数即可。
3. 代码实现
class Solution:
    def buildArray(self, target: List[int], n: int) -> List[str]:    
        ans = []
        pre = 0
        for x in target:   
            ans += ['Push','Pop']*(x - pre-1)
            ans.append('Push')
            pre = x
        return ans            

你可能感兴趣的:(英雄星球七月集训,今天开刷leetcode,leetcode,链表,算法)