• 第221题:最大正方形


    一. 问题描述

    现在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。

    示例:

    输入:

    1 0 1 0 0

    1 0 1 1 1

    1 1 1 1 1

    1 0 0 1 0

    输出: 4

    二. 解题思路

    本题思路:本题有两种方法进行求解,暴力法和动态规划的方法进行求解。

    第一种:暴力法:

    步骤一:依次遍历每一个值,当为0时跳过,如果为1时进行新的遍历

    步骤二:新的遍历是将1为左顶点,边长+1,遍历边长内的所有点是不是都为1如果是,则判断temp与边长*边长。直到不满足遍历条件,跳出,返回步骤一。

    步骤三:最终输出temp的值。

    第二种:动态规划的方法求解(要想到动态规划,把大正方形转换成小正方形的思路来解决)。

    步骤一:创建一个初始化为0但维度与matrix相同的矩阵number。将matrix的第一行,第一列全部添加到number中去。

    步骤二:遍历matrix矩阵,当值为1时,假设位置(i,j)则在number中相应的位置添加min(number(i-1,j),number(i-1,j-1),number(I,j-1))。

    步骤三:最后找出number中最大的值,就是所求的值。

    三. 执行结果

    第一种方法执行结果

    执行用时 :38 ms, 在所有 java 提交中击败了59.92%的用户

    内存消耗 :45.3 MB, 在所有 java 提交中击败了64.85%的用户

    第二种方法执行结果

    执行用时 :1 ms, 在所有 java 提交中击败了99.82%的用户

    内存消耗 :20MB, 在所有 java 提交中击败了98.73%的用户

    四. Java代码

    (1)暴力法:

    public int maximalSquare(char[][] matrix) {
           int number=0;
           for(int i=0;i<matrix.length;i++) {
               for(int j=0;j<matrix[0].length;j++) {
                   if(matrix[i][j]=='0') {
                       continue;
                   }else {
                       if(number==0) {
                           number=1;
                       }
                       int time=0;
                       boolean select=true;
                       while(select) {
                        if((i+time)>(matrix.length-2)||(j+time)>(matrix[0].length-2)) {
                            break;
                        }  
                        time++;
                        for(int m=i;m<=i+time;m++) {
                            for(int n=j;n<=j+time;n++) {
                                if(matrix[m][n]=='0') {
                                    select=false;
                                    break;
                                }
                            }
                            if(select==false) {
                                break;
                            }
                          }
                        if(((time+1)*(time+1))>=number&&select!=false) {
                              number=(time+1)*(time+1);
                           }
                       }
                     
                       
                   }
               }
           } 
           return number;
        }

    (2)动态规划法

    class Solution {
        public int maximalSquare(char[][] matrix) {
           if(matrix.length<=0||matrix[0]==null) {
                return 0;
            }
            int temp=0;
            int [][]number=new int[matrix.length][matrix[0].length];
            for(int i=0;i<matrix.length;i++) {
                if(temp<(matrix[i][0]-'0')) {
                    temp=matrix[i][0]-'0';
                }
                number[i][0]=matrix[i][0]-'0';
            }
            for(int j=0;j<matrix[0].length;j++) {
                if(temp<(matrix[0][j]-'0')) {
                    temp=matrix[0][j]-'0';
                }
                number[0][j]=matrix[0][j]-'0';
            }
            
            for(int m=1;m<matrix.length;m++)
                for(int n=1;n<matrix[0].length;n++) {
                   if(matrix[m][n]=='0') {
                       continue;
                   }
                    number[m][n]=Math.min(number[m-1][n], Math.min(number[m-1][n-1], number[m][n-1]))+1;
                    if(temp<number[m][n]) {
                        temp=number[m][n];
                    }
                }
            return temp*temp;
        }
    }
  • 相关阅读:
    Markdown基本语法学习
    gauge自动化测试框架(二)
    初识gauge自动化测试框架
    火狐浏览器历代版本下载地址
    selenium + python实现截图并且保存图片
    Python搭建简易HTTP服务(3.x版本和2.x版本的)
    ((0.1+0.7)*10) = ?
    从apache mod_php到php-fpm[转]
    Web API文档生成工具apidoc
    微信支付获取 prepay id 偶尔失败问题【转】
  • 原文地址:https://www.cnblogs.com/xiaobaidashu/p/12095090.html
Copyright © 2020-2023  润新知