代码随想录算法训练营第四十九天|leetcode42. 接雨水、leetcode84.柱状图中最大的矩形

1 leetcode42. 接雨水

题目链接:42. 接雨水 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:单调栈,经典来袭!LeetCode:42.接雨水_哔哩哔哩_bilibili

思路:就是说,我有些不理解,自己看的时候,不过看了视频以后,我貌似对我之前的方法,为什么不好,理解了

1.1 视频后的方法

思路在看视频的过程中,我确实是理解了呀,但是就是觉得,还是很绕其实,但是老师讲的很清晰,实话说

class Solution:
    def trap(self, height: List[int]) -> int:
        if len(height) <= 1:
            return 0
        result = 0
        stack = [0]
        for i in range(1,len(height)):
            if height[i]<=height[stack[-1]]:
                stack.append(i)
            else:
                while len(stack)!=0 and height[i]>height[stack[-1]]:
                    middle = stack[-1]
                    stack.pop()
                    if len(stack)!=0:
                        w = min(height[i],height[stack[-1]])-height[middle]
                        length = i-stack[-1]-1
                        result +=w*length
                stack.append(i)
        return result

1.2 本题小结

  1. 就是思路上面会有地方不理解吧,但是看的时候就很能理解为什么了,不过这道题目,我看思路都没看懂,就是说
  2. 然后就是一个,中间判断空的地方,这里会不定时的卡壳,希望慢慢的变好吧

2 leetcode84.柱状图中最大的矩形

题目链接:84. 柱状图中最大的矩形 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:单调栈,又一次经典来袭! LeetCode:84.柱状图中最大的矩形_哔哩哔哩_bilibili

思路:根据之前的方法,我写了一下,不过好像有地方行不通,不能满足所有的条件,但是可以通过一丢丢吧

2.1 自己的方法

能测试通过十几个案例吧,但是不能通过所有的方法

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        if len(heights)==1:
            return heights[0]
        result = 0
        stack = [0]
        for i in range(1,len(heights)):
            if heights[i]<heights[stack[-1]]:
                stack.append(i)
            else:
                while len(stack)!=0 and heights[i]>=heights[stack[-1]]:
                    w = heights[stack[-1]]
                    length = i-stack[-1]+1
                    stack.pop()
                    result = max(w*length,result)
                stack.append(i)
        return result        

2.2 视频后的方法

其实跟之前还是挺像的吧,就是我想不到前后加0,但是看完讲解以后,就理解了,主打一个讲解驱动型的选手

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        if len(heights)==1:
            return heights[0]
        heights.insert(0,0)
        heights.append(0)
        result = 0
        stack = [0]
        for i in range(1,len(heights)):
            if heights[i]>=heights[stack[-1]]:
                stack.append(i)
            else:
                while len(stack)!=0 and heights[i]<heights[stack[-1]]:
                    mid = stack[-1]
                    stack.pop()
                    if len(stack)!=0:
                        w = heights[mid]
                        length = i-stack[-1]-1
                        result = max(w*length,result)
                stack.append(i)
        return result        

2.3 本题小结

  1. 主要就是开始,把递增递减弄错了,后面就是不理解为什么要加入0,然后自己慢慢尝试吧
  2. 还是很多时候,需要自己去写,自己去思考,虽然做完了,但是,理解程度上还是有必要加深很多的

3 今日小结

  1. 恭喜自己,又一次在哔站上面将整个系列的内容学习完成啦
  2. 虽然掌握的还不是很明白,但是我也想和自己说,加油,拖拉的很多课程,终于算是补起来了,接下来去尝试图论,自己去看啦
posted @ 2024-12-11 16:54  小方呀0524  阅读(25)  评论(0)    收藏  举报