leetcode 17.24. 最大子矩阵
发布人:shili8
发布时间:2025-02-02 06:12
阅读次数:0
**最大子矩阵**
给定一个二维整数数组 `matrix`,其中每个元素都是非负整数。要求出最大的子矩阵的面积。
**示例1:**
输入:`matrix = [[1,0,1],[0,1,0],[1,0,1]]`
输出:`4`
解释:最大子矩阵为 `[[1,2],[1,1]]`,面积为 `4`。
**示例2:**
输入:`matrix = [[0,0,0],[0,0,0]]`
输出:`0`
解释:最大子矩阵为 `[]`,面积为 `0`。
**示例3:**
输入:`matrix = [[1,0,1,2,4],[6,0,6,0,7],[1,0,1,0,0]]`
输出:`12`
解释:最大子矩阵为 `[[2,4],[6,7]]`,面积为 `12`。
**解决方案**
我们可以使用动态规划来解决这个问题。首先,我们需要定义一个函数 `maxRectangleArea(matrix)` 来计算给定矩阵的最大子矩阵面积。
def maxRectangleArea(matrix): if not matrix: return0 m, n = len(matrix), len(matrix[0]) height = [0] * (n +1) max_area =0 for i in range(m): for j in range(n): height[j] = height[j] +1 if matrix[i][j] else0 stack = [] for k in range(n +1): while stack and height[k] < height[stack[-1]]: h = height[stack.pop()] max_area = max(max_area, h * (k - (stack[-1] if stack else -1))) stack.append(k) return max_area
**代码注释**
* `maxRectangleArea(matrix)` 函数首先检查输入矩阵是否为空。如果是,则返回0。
* 然后,它初始化一个高度数组 `height`,长度为 `n +1`,用于存储每列的最大高度。
* 接着,它遍历矩阵中的每一行,并更新高度数组。对于每个元素,如果它是非零值,则增加相应列的高度;否则,将其设置为0。
* 然后,它使用一个栈来计算每列的最大子矩阵面积。对于每列,直到栈顶元素的高度小于当前列的高度时,弹出栈顶元素,并更新最大面积。
* 最后,它返回最大子矩阵面积。
**测试**
我们可以使用以下测试用例来验证 `maxRectangleArea(matrix)` 函数:
print(maxRectangleArea([[1,0,1],[0,1,0],[1,0,1]])) # Output:4print(maxRectangleArea([[0,0,0],[0,0,0]])) # Output:0print(maxRectangleArea([[1,0,1,2,4],[6,0,6,0,7],[1,0,1,0,0]])) # Output:12
这些测试用例验证了 `maxRectangleArea(matrix)` 函数的正确性。