代码随想录第60天(总结篇)|84. 柱状图中最大的矩形及一刷总结

86 阅读3分钟

84. 柱状图中最大的矩形

1. doc reading

image.png

示例的这张图中,其实是以5作为当前遍历元素,左侧第一个比它小的主柱子高度为1, 右侧第一个比他小的柱子是高度为2.

所以只要找到左右第一个小柱子,记录左右下标,以及当前柱子高度就能算出遍历到这个柱子时的最大矩形。

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        heights = [0] + heights + [0]
        stack = [0]
        max_area = 0
        for i in range(1, len(heights)):
            if heights[i] > heights[stack[-1]]:
                stack.append(i)
            elif heights[i] == heights[stack[-1]]:
                stack.pop()
                stack.append(i)
            else:
                while (len(stack) > 0) and (heights[i] < heights[stack[-1]]):
                    high = heights[stack[-1]]
                    stack.pop()
                    left_idx = stack[-1]
                    right_idx = i
                    wide = right_idx - left_idx - 1
                    area = wide * high
                    max_area = max(max_area, area)
                stack.append(i)
        return max_area

总结

收获

1. 数组

主要有三类提醒:滑动窗口(快慢指针)、基本操作(删除元素)和模拟操作(螺旋矩阵)、二分查找。 其中尤其注意二分查找一定要坚持保证不变量的一致性。

2. 链表

环形链表这种需要做数学推理计算,而非侧重编码的题目是很难的。

24.两两交换链表中的节点这道题,思想简单但是实际实现起来是有困难的。 经常会因为指针的操作而混乱。

3. 哈希表

要么是字典、要么是集合、甚至可以输数组,这些都是Python中实现哈希的数据结构。 根据不同的情况选择不同的实现方式。

这里还有一个就是字符串的遍历方式,其实是直接用for遍历就可以。

注意Python中set的相关操作。

另外还可以用set来做周期的探测,看看结果是否是一个周期循环的过程。

4. 字符串

541. 反转字符串 II 中合理利用range方法就能解决复杂问题。

对于# 151. 反转字符串中的单词 可以只处理非空格字符,当遇到空格就跳过,直到当前字符为非空格时,如果不是首单词,先加个空格,再加整个单词。 然后反转整个字符串,再一个一个单词单独反转。

KMP算法的关键在于构建前缀表。前缀表的构建其实也是一种用前缀匹配其余部分字符串的过程。

5. 贪心算法

这一部分我打算整体重做,没有办法,我确实没有办法识别那些不能显而易见得到的最优子结构。

6. 动态规划

其实这个我感觉没有贪心法那么反人类,基本上可以理解思路:

  1. 背包问题
  2. 打家劫舍
  3. 股票买卖(这个状态很多)
  4. 编辑距离
  5. 回文子串(这个是唯一一种dp每个单元存的不是最后的结果,这样才能构建递推关系。)

7.单调栈

这个很简单。只是记得接雨水的固定解决方法,左右和中间如何构建凹槽。

过程中的不足

  1. 有些题目是自己完全没有思路的,尤其在贪心算法部分,我根本没有办法识别出问题中哪一部分最优子结构。
  2. 没有专门学习排序算法,我此前在面试过程中遇到让我手撕快速排序的题目,但是代码随想录中没有讲到,有可能是因为过于基础而不讲吧。

总结感悟

60天时间很快过去,总算是刷完了,几乎成了我每天和三餐一样必做的一件事,接下来这段时间没有了每日跟代码随想录打卡刷题,但是还是打算重新回顾,把Top100刷完,并且回顾基本排序算法,希望能在秋招结束后有个好归宿吧。