注:今天是代碼隨想錄訓練營的最后一天啦!!!
本文目錄
- 84.柱狀圖中最大的矩形
- 做題
- 看文章
- 以往忽略的知識點小結
- 個人體會
84.柱狀圖中最大的矩形
代碼隨想錄:84.柱狀圖中最大的矩形
Leetcode:84.柱狀圖中最大的矩形
做題
無思路。
看文章
與 42. 接雨水 很像,42. 接雨水 是找每個柱子左右兩邊第一個大于該柱子高度的柱子,而本題是找每個柱子左右兩邊第一個小于該柱子的柱子。
舉例說明求解:[2, 1, 5, 6, 2, 3]。以1為基準,左右都沒有比1小的,所以1可以向左右拓展到底,即高為1、寬為6。以5為基準,左邊1<5,右邊2<5,所以5可以向左拓展到1(開區間),向右拓展到2(開區間),即高為5、寬為2。
在此基礎上結合單調棧,具體可看視頻。
# 單調棧
class Solution:def largestRectangleArea(self, heights: List[int]) -> int:# Monotonic Stack'''找每個柱子左右側的第一個高度值小于該柱子的柱子單調棧:棧頂到棧底:從大到小(每插入一個新的小數值時,都要彈出先前的大數值)棧頂,棧頂的下一個元素,即將入棧的元素:這三個元素組成了最大面積的高度和寬度情況一:當前遍歷的元素heights[i]大于棧頂元素的情況情況二:當前遍歷的元素heights[i]等于棧頂元素的情況情況三:當前遍歷的元素heights[i]小于棧頂元素的情況'''# 輸入數組首尾各補上一個0(與42.接雨水不同的是,本題原首尾的兩個柱子可以作為核心柱進行最大面積嘗試heights.insert(0, 0)heights.append(0)stack = [0]result = 0for 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 stack and heights[i] < heights[stack[-1]]:# 棧頂就是中間的柱子,主心骨mid_index = stack[-1]stack.pop()if stack:left_index = stack[-1]right_index = iwidth = right_index - left_index - 1height = heights[mid_index]result = max(result, width * height)stack.append(i)return result
時間復雜度: O(n)
空間復雜度: O(n)
以往忽略的知識點小結
- 單調棧的思路還是不熟
個人體會
完成時間:1h30min。
心得:84.柱狀圖中最大的矩形 與 42.接雨水 思路差不多,但為什么怎么做,還需要多琢磨琢磨。很感嘆的是,算法訓練營今天就結營了,感覺時間飛快。
?