zoukankan      html  css  js  c++  java
  • 最大正方形

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

    示例:

    输入: 
    
    1 0 1 0 0
    1 0 1 1 1
    1 1 1 1 1
    1 0 0 1 0
    
    输出: 4

    class Solution {
        public int maximalSquare(char[][] arr) {
            int len = arr.length;
            if (len == 0) {
                return 0;
            }
            int inner_len = arr[0].length;
            int [] dp = new int[inner_len + 1];
            int pre = 0;
            int max = 0;
            for (int i = 0; i < len; i++) {
                for (int j = 0; j < inner_len; j++) {
                    int temp = dp[j + 1];
                    if (arr[i][j] == '0') {
                        dp[j + 1] = 0;
                    } else {
                        dp[j + 1] = Math.min(dp[j], Math.min(dp[j + 1], pre)) + 1;
                    }
                    max = Math.max(max, dp[j + 1]);
                    pre = temp;
                }
            }
            return max * max;
        }
    }

    入上图所示,当我们想求位置4(记做i,j位置)为右下角时,正方形的最大边长,记做dp[i][j]

    我们可以先不考虑正方形,只考虑长方形(最后取较短边即可)

    那么以n为右下角的时候,dp[i][j]向上延伸的最大程度为 xd(dp[i-1][j])和oa(dp[i-1][j-1])的较小值, 向左延伸的最大程度为ob(dp[i-1][j-1])和yf(dp[i][j-1])的较小值

    那么dp[i][j]向上延伸和向左延伸的较小值则为最大正方形边长min( min(dp[i-1][j], dp[i-1][j-1]), min(dp[i-1][j-1], dp[i][j-1])) 最后要考虑右下角这个位置的边长为1,

    那么当[i, j]位置为1 的时候,dp[i][j] = min(min(dp[i-1][j], dp[i-1][j-1]),dp[i][j-1]) + 1;

    那么当[i, j]位置为0 的时候,dp[i][j] = 0;

    二维dp 一般都可以压缩为一维的

  • 相关阅读:
    Python-asyncio
    Python-异步编程
    软件工程个人作业01
    《构建之法》阅读笔记6
    《构建之法》阅读笔记5
    《构建之法》阅读笔记4
    《构建之法》阅读笔记3
    《构建之法》第二章阅读笔记
    《构建之法》第一章阅读笔记
    开发web信息管理系统用到的相关技术
  • 原文地址:https://www.cnblogs.com/tobemaster/p/12398706.html
Copyright © 2011-2022 走看看