zoukankan      html  css  js  c++  java
  • [LeetCode] 221. 最大正方形(DP)

    题目

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

    示例:

    输入:

    1 0 1 0 0
    1 0 1 1 1
    1 1 1 1 1
    1 0 0 1 0

    输出: 4

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/maximal-square
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    题解

    • dp[i][j] 表示以matrix[i-1][j-1]为右下角的最大正方形的边长
    • 转移方程:dp[i][j]=1+min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1]) 即除此点外将覆盖完全的最大正方形
    • 使用滚动数组减少一维空间,空间复杂度O(n)
    • 之所以dp[i][j]表示matrix[i-1][j-1],是免去了边界特例的判断,初始化自然为0
    • 注意二维数组对于数组长度为0的判断也是十分必要的。

    代码

    class Solution {
        public int maximalSquare(char[][] matrix) {
    		if (matrix == null || matrix.length == 0) { //
    			return 0;
    		}
    
    		int rows = matrix.length;
    		int cols = matrix[0].length;
    		int[] preDp = new int[cols + 1];
    		int[] curDp = new int[cols + 1];
    
    		int maxLen = 0;
    		for (int i = 1; i <= rows; ++i) {
    			for (int j = 1; j <= cols; ++j) {
    				if (matrix[i - 1][j - 1] == '1') {
    					curDp[j] = 1 + Math.min(preDp[j - 1], Math.min(preDp[j], curDp[j - 1]));
    					if (curDp[j] > maxLen) {
    						maxLen = curDp[j];
    					}
    				}
    			}
    			for (int j = 1; j <= cols; ++j) {// 更新两个dp数组
    				preDp[j] = curDp[j];
    				curDp[j] = 0;
    			}
    		}
    		return maxLen * maxLen;
    	}
    }
    
  • 相关阅读:
    第01组 团队项目-需求分析报告
    团队项目-选题报告
    第08组 Beta冲刺(4/5)
    第08组 Beta冲刺(3/5)
    第08组 Beta冲刺(2/5)
    第08组 Beta冲刺(1/5)
    第08组 Alpha事后诸葛亮
    第08组 Alpha冲刺(6/6)
    第08组 Alpha冲刺(5/6)
    第08组 Alpha冲刺(4/6)
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/11741284.html
Copyright © 2011-2022 走看看