LeetCodeDifficult-【85. 最大矩形】

类似题:LeetCodeDifficult-【84. 柱状图中最大的矩形】

给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

示例:

输入:
[
  ["1","0","1","0","0"],
  ["1","0","1","1","1"],
  ["1","1","1","1","1"],
  ["1","0","0","1","0"]
]
输出: 6

来源:力扣(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
发布了314 篇原创文章 · 获赞 22 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_39451578/article/details/105226938
今日推荐