• lintcode 631 · 最大矩阵II【矩阵 中等 vip】


    题目

    https://www.lintcode.com/problem/631

    给出一个只有 01 组成的二维矩阵。
    找出最大的一个子矩阵,使得这个子矩阵的主对角线元素均为 1 ,其他元素均为 0 。
    
    
    你可以认为所求的矩阵一定是一个方阵。
    主对角线指的是从左上角到右下角的一条对角线。
    
    样例
    例1:
    
    输入:
    [[1,0,1,0,0],[1,0,0,1,0],[1,1,0,0,1],[1,0,0,1,0]]
    输出:
    9
    解释:
    [0,2]->[2,4]2:
    
    输入:
    [[1,0,1,0,1],[1,0,0,1,1],[1,1,1,1,1],[1,0,0,1,0]]
    输出:
    4
    解释:
    [0,2]->[1,3]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    答案

    public class Solution {
        /**
         * @param matrix: a matrix of 0 an 1
         * @return: an integer
         */
        public int maxSquare2(int[][] matrix) {
                int n = matrix.length,m=matrix[0].length,max =0;
            int[][] dp = new int[n][m];
    
            for (int i = 0; i <n ; i++) {
                if(matrix[i][0] ==1){
                    dp[i][0] =1;
                    max =1;
                }
            }
    
            for (int j = 0; j < m; j++) {
                if(matrix[0][j] ==1){
                    dp[0][j] =1;
                    max =1;
                }
            }
    
            for (int i = 1; i <n ; i++) {
                for (int j = 1; j <m ; j++) {
                    if(matrix[i][j] !=1){
                        continue;
                    }
                    dp[i][j]=1;
    
                    if(all0(matrix,i,j,dp[i-1][j-1])){
                        dp[i][j] +=dp[i-1][j-1];
                    }
                    max =Math.max(max,dp[i][j]);
                }
            }
    
            return max*max;
        }
    
        public static boolean all0(int[][] mattrix,int i,int j,int offset){
            while (offset>0){
                if(mattrix[i-offset][j] ==1 || mattrix[i][j-offset] ==1)
                    return false;
    
                offset--;
            }
    
            return true;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    本地测试代码

    public class LC631 {
    
        public static int maxSquare2(int[][] matrix) {
            int n = matrix.length,m=matrix[0].length,max =0;
            int[][] dp = new int[n][m];
    
            for (int i = 0; i <n ; i++) {
                if(matrix[i][0] ==1){
                    dp[i][0] =1;
                    max =1;
                }
            }
    
            for (int j = 0; j < m; j++) {
                if(matrix[0][j] ==1){
                    dp[0][j] =1;
                    max =1;
                }
            }
    
            for (int i = 1; i <n ; i++) {
                for (int j = 1; j <m ; j++) {
                    if(matrix[i][j] !=1){
                        continue;
                    }
                    dp[i][j]=1;
    
                    if(all0(matrix,i,j,dp[i-1][j-1])){
                        dp[i][j] +=dp[i-1][j-1];
                    }
                    max =Math.max(max,dp[i][j]);
                }
            }
    
            return max*max;
        }
    
        public static boolean all0(int[][] mattrix,int i,int j,int offset){
            while (offset>0){
                if(mattrix[i-offset][j] ==1 || mattrix[i][j-offset] ==1)
                    return false;
    
                offset--;
            }
    
            return true;
        }
        public static void main(String[] args) {
            System.out.println(maxSquare2(new int[][]
                    {
                            {1,0,1,0,0},
                            {1,0,0,1,0},
                            {1,1,0,0,1},
                            {1,0,0,1,0}})); //9
    
            System.out.println(maxSquare2(new int[][]
                    {
                            {1,0,1,0,1},
                            {1,0,0,1,1},
                            {1,1,1,1,1},
                            {1,0,0,1,0}})); //4
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
  • 相关阅读:
    《用Go语言自制解释器》之第5章 宏系统
    SadTalker 让图片说话
    Python入门之设置环境变量与缩进
    配置anaconda+安装cuda和cudnn+将cuda和cudnn配置到指定目录+使用cuda命令安装cuda和cudnn
    LA@二次型标准形@标准化问题介绍和合同对角化@二次型可标准化定理
    【数据分享】深圳市出租车GPS数据
    Pinia学习
    Talk | 马里兰大学博士生吴曦旸:分布式多智能体强化学习在复杂交通轨迹规划中的应用
    Pycharm编辑器设置提示函数参数
    最近opencv又报了啥错(一)
  • 原文地址:https://blog.csdn.net/weixin_37991016/article/details/132817953