• 85. Maximal Rectangle


    一、题目

      1、审题

      2、分析

        给出一个含有 ‘0‘、’1’ 字符的矩阵,求其中的 ‘1‘ 形成的子矩阵的最大面积。

    二、解答

      1、思路:

        采用三个一维数组:

          left[cols]:  若该元素为 ‘1‘,则记录此元素以及之前行的形成矩阵的最大左边界。

          right[cols]: 若该元素为 ‘1‘,则记录此元素以及之前行的形成矩阵的最大右边界。 

          right[cols]: 若该元素为 ‘1‘,则记录此元素以及之前行具有相同左右边界的矩阵的最大高度。

        

    public int maximalRectangle(char[][] matrix) {
            if (matrix == null || matrix.length == 0 ||
                    matrix[0] == null || matrix[0].length == 0)
                return 0;
            
            int m = matrix.length;
            int n = matrix[0].length;
            int maxArea = 0;
    
            int[] left = new int[n];
            int[] right = new int[n];
            int[] height = new int[n];
            Arrays.fill(right, n-1);
            
            for (int i = 0; i < m; i++) {    // 每一行
                
                int rB = n - 1;
                for(int j = n - 1; j >= 0; j--) {    // 填充 right[j]
                    if(matrix[i][j] == '1') {
                        right[j] = Math.min(right[j], rB);  // 考虑上面行的 右边界
                    }
                    else {
                        right[j] = n - 1;    // 代表此元素为 0
                        rB = j - 1;    // 假想下一个元素右边为 1 的边界
                    }
                }
                
                int lB = 0;
                for (int j = 0; j < n; j++) {
                    if(matrix[i][j] == '1') {
                        left[j] = Math.max(left[j], lB); // 考虑上面行的左边界
                        height[j]++;
                        maxArea = Math.max(maxArea, height[j] * (right[j] - left[j] + 1));
                    }
                    else {
                        height[j] = 0; // 
                        left[j] = 0;    // 代表此元素为 0
                        lB = j + 1;    // 假想下一个元素的左边为 1 的边界
                    }
                }
            }
            return maxArea;
        }
  • 相关阅读:
    LOJ6435 「PKUSC2018」星际穿越
    LOJ6433 「PKUSC2018」最大前缀和
    LOJ2541 「PKUWC2018」猎人杀
    LOJ2545 「JXOI2018」守卫
    LOJ2290 「THUWC 2017」随机二分图
    CF1007B Pave the Parallelepiped
    【学习笔记】卡特兰数
    Linux系统命令“su
    免密
    Window操作系统下的SSL证书管理
  • 原文地址:https://www.cnblogs.com/skillking/p/9698287.html
Copyright © 2020-2023  润新知