同様の質問:LeetCodeDifficult- [84.ヒストグラムの最大の長方形]
0と1のみを含む2次元のバイナリマトリックスを指定すると、1のみを含む最大の四角形を見つけ、その領域を返します。
例:
入力:
[
["1"、 "0"、 "1"、 "0"、 "0"]、
["1"、 "0"、 "1"、 "1"、 "1"]、
["1 "、" 1 "、" 1 "、" 1 "、" 1 "]、
[" 1 "、" 0 "、" 0 "、" 1 "、" 0 "]
]
出力:6
出典:LeetCode(LeetCode)
リンク:https ://leetcode-cn.com/problems/maximal-rectangle
著作権は控除ネットワークに属しています。商用転載の正式な許可書に連絡し、非商用転載の出典を明記してください。
思路1: https ://leetcode-cn.com/problems/maximal-rectangle/solution/zui-da-ju-xing-by-leetcode/
class Solution:
def maximalRectangle(self, matrix: List[List[str]]) -> int:
# dp
# dp = [[0]*len(matrix[0])] * len(matrix) # 这种的不行,修改值会出问题
# dp = np.zeros((len(matrix), len(matrix[0])), dtype=int)
dp = [[0]*len(matrix[0]) for _ in range(len(matrix))]
ans = 0
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j] == '0':
continue
width = dp[i][j] = dp[i][j-1] + 1 if j != 0 else 1
# print(dp)
# 开始以i,j为右下角的矩形顶点,往上查找
for k in range(i, -1, -1):
if dp[k][j] == 0:
break
width = min(width, dp[k][j])
# print(i,j,k, width, (i - k + 1))
ans = max(ans, width * (i - k + 1))
return ans
アイデア2:要素が各行にある列の連続する高さを数えると、[84.ヒストグラムの最大の四角形] として見ることができます。
同様の質問:LeetCodeDifficult- [84.ヒストグラムの最大の長方形]
class Solution:
def maximalRectangle(self, matrix: List[List[str]]) -> int:
if matrix == []:
return 0
# 每行构成的矩形高度,与前一行有关
dp = [0]*len(matrix[0])
ans = 0
for i in range(len(matrix)):
for j in range(len(matrix[0])):
dp[j] = dp[j] + 1 if matrix[i][j] == '1' else 0
# print(dp)
ans = max(ans, self.countArea(dp))
return ans
# 计算每行矩形构成的面积
def countArea(self, dp):
dp = [0] + dp + [0] # 保证最后一个是最小的,最后不会剩余
max_area = 0
stack = []
for i in range(len(dp)):
while stack != [] and dp[stack[-1]] > dp[i]:
top = stack.pop()
# print(i, stack[-1])
max_area = max(max_area, dp[top] * (i - stack[-1] - 1))
stack.append(i)
# print(dp)
return max_area