单调栈

由于有四种情况的单调栈,为了不容易出错,我决定全部转换成「求左边第一个比自己小的」单调栈

0X00 模板

求左边第一个比自己小的 模板

def make(a):
    n = len(a)
    ans = [float("inf")] * n
    stack = []
    for i, v in enumerate(a):
        while stack and stack[-1] >= v: stack.pop()
        if stack: ans[i] = stack[-1]
        stack.append(v)
    return ans
  • 如果求左边第一个比自己大的,就把原数组取负
  • 如果求右边第一个比自己小的,就把原数组取反,最后一定要思考是不是要反过来
  • 如果求右边第一个比自己大的,就把原数组取反,再全部取负数,最后也一定要思考是不是要反过来

0X01 引申

求左边比自己大的里面最小的

我们把原数组的下标按照值按降序排序,然后左边第一个下标比自己小的就是「左边比自己大的里面最小的」

975. 奇偶跳

class Solution:
    def oddEvenJumps(self, A: List[int]) -> int:
        def make(a):
            stack, res = [], [None] * n
            for _, v in enumerate(a):
                while stack and stack[-1] > v: stack.pop()
                if stack: res[v] = stack[-1]
                stack.append(v)
            return res
        
        n, A = len(A), A[::-1]
        B = sorted(range(n), key=lambda i: -A[i])
        oddprev = make(B)
        B = sorted(range(n), key=lambda i: A[i])
        evenprev = make(B)
        odd, even = [False] * n, [False] * n
        odd[0] = even[0] = True
        for i in range(1, n):
            if oddprev[i] != None:
                odd[i] = even[oddprev[i]]
            if evenprev[i] != None:
                even[i] = odd[evenprev[i]]

        return sum(odd)

求左边比自己小的最大的

把原数组的下标按升序排序,然后左边第一个下标比自己小的就是「左边比自己小的最大的」

0X02 相关题目

注意判断尽量使用 != None

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • leetcode 题解 84. Largest Rectangle in Histogram (单调栈的应用们) ...
    cunfate阅读 1,110评论 0 1
  • 题目 给定一个不含重复值的数组arr,找到一个i位置左边和右边离i位置最近且值比arr[i]小的位置。返回所有位置...
    呤雪情枫阅读 1,258评论 0 1
  • 最近在刷 LeetCode 的时候被时间复杂度困了好久,查看别人的题解,原来用到了单调递减栈,于是详细学习了一下记...
    测试开发小白变怪兽阅读 11,415评论 0 6
  • 背景问题 给定长度为的数组,其每个元素为非负整数,计算其所有连续子序列的最小值之和 问题分析 首先可以很直观的想到...
    AsuraLG阅读 1,582评论 0 2
  • 作者已经好久没有更了,是因为前面的剧情作者实在没办法编了所以打算重写,谢谢❤
    指尖上的佛铃花阅读 244评论 0 0

友情链接更多精彩内容