LeetCodeDifficult- [85.最大長方形]

同様の質問: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

 

公開された314元の記事 ウォン称賛22 ビュー20000 +

おすすめ

転載: blog.csdn.net/qq_39451578/article/details/105226938