• 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
  • 相关阅读:
    微信支付——微信H5支付实战教程(微信支付v3版本java)
    [Unity]OCR识别--OpenCV篇
    如何使用 ABAP 代码发送邮件到指定邮箱试读版
    计算机网络原理 谢希仁(第8版)第二章习题答案
    手把手带你实现基于 Vite+Vue3 的在线Excel表格系统
    基础算法 - 求子矩阵的和
    spring的简单使用(配合Druid操作数据库)
    Python网页解析库:用requests-html爬取网页
    山东菏泽家乡网页代码 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计
    C++day3
  • 原文地址:https://blog.csdn.net/weixin_37991016/article/details/132817953