力扣第85题-最大矩形
力扣链接:85. 最大矩形 - 力扣(LeetCode)
给定一个仅包含 0
和 1
、大小为 rows x cols
的二维二进制矩阵,找出只包含 1
的最大矩形,并返回其面积。
输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]] 输出:6 解释:最大矩形如上图所示。
输入:matrix = [["0"]] 输出:0
输入:matrix = [["1"]] 输出:1
"""
思路:
此题和84题思路一样,只是增加的条件,我们可以把他看成多层叠加的
我们可以把二维数组转换成1维的高度数组
[["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]
]
我们可以看成4个一维的高度数组,高度就是当前行的位置1增加,如果当前行的位置为0则高度就是0第1行为底的柱子:["1","0","1","0","0"] max = 1
第2行为底的柱子:["2","0","2","1","1"] max = 3
第3行为底的柱子:["3","1","3","2","2"] max = 6
第4行为底的柱子:["4","0","0","3","0"] max = 4"""
from platform import mac_verdef maximalRectangle(matrix):m = len(matrix)n = len(matrix[0])heights_list = []heights = [0] * n# 遍历每一行for i in range(m):for j in range(n):# 如果当前位置是 '1',则增加高度,否则高度为 0if matrix[i][j] == '1':heights[j] = heights[j] + 1else:heights[j] = 0# heights_list.append(heights[:]) # 此处有坑,heights[:]等于copy,不然append的都是最后一个 heightsheights_list.append(heights.copy())# 这里就可以调用84题的方法来处理def largestRectangleArea(heights):max_area = 0 # 记录最大值for i in range(len(heights)): # 循环遍历每一个索引位置p = i # 初始p为当前的i的位置while p < len(heights): # p到达数组末尾,结束循环if heights[p] == 0: # 当p位置的值是0的时候,直接跳出循环,因为0高度,不能构成矩形breakw = p - i + 1 # 计算当前p位置到i位置的宽度cur_value = w * min(heights[i:p + 1]) # 高取当前i和p位置数组中的最小的值,矩形面积是有最矮的构成的来决定的max_area = max(max_area, cur_value) # 更新最大面积的值p = p + 1 # 指针右移动return max_areamax_area = 0for heights in heights_list:value = largestRectangleArea(heights)max_area = max(max_area, value)return max_areaprint(maximalRectangle([["1", "0", "1", "0", "0"], ["1", "0", "1", "1", "1"], ["1", "1", "1", "1", "1"], ["1", "0", "0", "1", "0"]]))
print(maximalRectangle([["1"]]))
print(maximalRectangle([["0"]]))