<address id="xtb1b"></address>
<sub id="xtb1b"></sub>

<address id="xtb1b"><var id="xtb1b"></var></address><sub id="xtb1b"></sub>

      <sub id="xtb1b"></sub>

      <sub id="xtb1b"><var id="xtb1b"></var></sub>
      <address id="xtb1b"></address>

      <sub id="xtb1b"><var id="xtb1b"><output id="xtb1b"></output></var></sub>

      <sub id="xtb1b"><dfn id="xtb1b"></dfn></sub>

      leetcode-85-最大矩形

      题目描述:

      方法一:动态规划+使用柱状图的优化暴力方法 O(N*2M) O(NM) N为行数

      class Solution:
          def maximalRectangle(self, matrix: List[List[str]]) -> int:
              maxarea = 0
      
              dp = [[0] * len(matrix[0]) for _ in range(len(matrix))]
              for i in range(len(matrix)):
                  for j in range(len(matrix[0])):
                      if matrix[i][j] == 0: continue
      
                      # compute the maximum width and update dp with it
                      width = dp[i][j] = dp[i][j-1] + 1 if j else 1
      
                      # compute the maximum area rectangle with a lower right corner at [i, j]
                      for k in range(i, -1, -1):
                          width = min(width, dp[k][j])
                          maxarea = max(maxarea, width * (i-k+1))
              return maxarea

      方法二:栈 参考84题 O(NM) O(M)

      class Solution:
          def maximalRectangle(self, matrix: List[List[str]]) -> int:
              if not matrix: return 0
              maxarea = 0
              dp = [0 for _ in range(len(matrix[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
                  maxarea = max(maxarea,self.largestRectangleArea(dp))
              return maxarea
      
          def largestRectangleArea(self, heights: List[int]) -> int:
              stack = [0]
              heights = [0] + heights + [0]
              res = 0
              for i in range(len(heights)):
                  while heights[stack[-1]] > heights[i]:
                      tmp = stack.pop()
                      res = max(res, (i - stack[-1] - 1) * heights[tmp])
                  stack.append(i)
              return res

      方法三:动态规划  O(NM)

      class Solution:
          def maximalRectangle(self, matrix: List[List[str]]) -> int:
              if not matrix or not matrix[0]: return 0
              row = len(matrix)
              col = len(matrix[0])
              left_j = [-1] * col
              right_j = [col] * col
              height_j = [0] * col
              res = 0
              for i in range(row):
                  cur_left = -1
                  cur_right = col
      
                  for j in range(col):
                      if matrix[i][j] == "1":
                          height_j[j] += 1
                      else:
                          height_j[j] = 0
      
                  for j in range(col):
                      if matrix[i][j] == "1":
                          left_j[j] = max(left_j[j], cur_left)
                      else:
                          left_j[j] = -1
                          cur_left = j
      
                  for j in range(col - 1, -1, -1):
                      if matrix[i][j] == "1":
                          right_j[j] = min(right_j[j], cur_right)
                      else:
                          right_j[j] = col
                          cur_right = j
                  for j in range(col):
                      res = max(res, (right_j[j] - left_j[j] - 1) * height_j[j])
              return res
      相关文章
      相关标签/搜索
      三期之内心开一肖