列表

详情


1727. 重新排列后的最大子矩阵

给你一个二进制矩阵 matrix ,它的大小为 m x n ,你可以将 matrix 中的  按任意顺序重新排列。

请你返回最优方案下将 matrix 重新排列后,全是 1 的子矩阵面积。

 

示例 1:

输入:matrix = [[0,0,1],[1,1,1],[1,0,1]]
输出:4
解释:你可以按照上图方式重新排列矩阵的每一列。
最大的全 1 子矩阵是上图中加粗的部分,面积为 4 。

示例 2:

输入:matrix = [[1,0,1,0,1]]
输出:3
解释:你可以按照上图方式重新排列矩阵的每一列。
最大的全 1 子矩阵是上图中加粗的部分,面积为 3 。

示例 3:

输入:matrix = [[1,1,0],[1,0,1]]
输出:2
解释:由于你只能整列整列重新排布,所以没有比面积为 2 更大的全 1 子矩形。

示例 4:

输入:matrix = [[0,0],[0,0]]
输出:0
解释:由于矩阵中没有 1 ,没有任何全 1 的子矩阵,所以面积为 0 。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int largestSubmatrix(vector<vector<int>>& matrix) { } };

python3 解法, 执行用时: 484 ms, 内存消耗: 37.6 MB, 提交时间: 2022-12-07 17:58:45

class Solution:
    def largestSubmatrix(self, matrix: List[List[int]]) -> int:
        #同84题,85题
        R, C = len(matrix), len(matrix[0])
        heights = [[0 for _ in range(C)] for _ in range(R)]     #每一行的高度数组
        for c in range(C):
            heights[0][c] = matrix[0][c]
        for r in range(1, R):
            for c in range(C):
                if matrix[r][c] == 1:
                    heights[r][c] = heights[r-1][c] + 1
                else:
                    heights[r][c] = 0

        res = 0
        for r in range(R):
            heights[r].sort()                       #是为了贪心
            for c in range(C):
                cur_area = heights[r][c] * (C - c)  #当前的高度就是最低了。
                res = max(res, cur_area)
        return res

java 解法, 执行用时: 9 ms, 内存消耗: 67 MB, 提交时间: 2022-12-07 17:47:41

/**
 * 预处理数组,计算以这个点为结尾,上面有多少个连续的1,
 * 就是这一列以这个点为结尾的最大高度,这样就将二维问题转成一维
 * 遍历每一行,对每一行进行排序,记录矩形的最长的高度,每次更新结果
 */
class Solution {
    public int largestSubmatrix(int[][] matrix) {
        int n=matrix.length;
        int m=matrix[0].length;
        int res=0;
        for(int i=1;i<n;i++){
            for(int j=0;j<m;j++){
                if(matrix[i][j]==1){
                    //记录向上连续1的个数
                    matrix[i][j]+=matrix[i-1][j];
                }
            }
        }
        for(int i=0;i<n;i++){
            Arrays.sort(matrix[i]);
            for(int j=m-1;j>=0;j--){
                //更新矩形的最大高度
                int height=matrix[i][j];
                //更新最大面积
                res=Math.max(res,height*(m-j));
            }
        }
        return res;
    }
}

上一题