LintCode 最大正方形

题目

在一个二维01矩阵中找到全为1的最大正方形

样例
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
返回 4

分析

动态规划
dp[i][j]:最大正方形的边长
状态转移方程:
if(matrix[i][j] == 1)
{
dp[i][j] = Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1])) + 1;
}
else
dp[i][j] = 0;

代码

public class Solution {
    /**
     * @param matrix: a matrix of 0 and 1
     * @return: an integer
     */
    public int maxSquare(int[][] matrix) {
        int ans = 0;
        //得到行数
        int n = matrix.length;
        int m;
        //得到列数
        if(n > 0)
            m = matrix[0].length;
        else 
            return ans;
        //dp[i][j] 最大正方形的边长
        int[][] dp = new int [n][m];
        //初始化初始条件
        for(int i=0;i<n;i++)
            if(matrix[i][0] == 1) {
                dp[i][0] = matrix[i][0];
                ans = 1;
            }
        
        for(int i=0;i<m;i++)
            if(matrix[0][i] == 1) {
                dp[0][i] = matrix[0][i];
                ans = 1;
            }
        
        //状态转移方程,用ans存储最大边长
        for(int i=1;i<n;i++) {
            for(int j=1;j<m;j++) {
                if(matrix[i][j] == 1) {
                    dp[i][j] = Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1])) + 1;
                }
                else
                    dp[i][j] = 0;
                ans = Math.max(dp[i][j], ans);
            }
            
        }
        
        return ans*ans;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,357评论 0 33
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 14,695评论 0 89
  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 8,866评论 0 18
  • TF API数学计算tf...... :math(1)刚开始先给一个运行实例。tf是基于图(Graph)的计算系统...
    MachineLP阅读 9,239评论 0 1
  • 一大早的闹钟就开始响了 你看没有你的日子我起床很顺利 只是我习惯性的像你一样学会赖床 我今天要起来给自己画妆 让自...
    愤怒的小钢琴阅读 1,886评论 0 0

友情链接更多精彩内容