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

思路:

动态规划,时间复杂度为O(n^2)
dp[i][j]表示以点(i, j)为右下角的正方形的最大边长;状态转移方程:
dp[i][j] = min(min(dp[i - 1][j - 1], dp[i][j-1]),min(dp[i-1][j - 1], dp[i - 1][j])) + 1;

当我们判断以某个点为正方形右下角时最大的正方形时,那它的上方,
左方和左上方三个点也一定都是某个正方形的右下角,否则该点为右下角的正方形最大就是它自己了。
这是定性的判断。

代码:

class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {

        if(matrix.empty() || matrix[0].empty())
        	return 0;
        int m = matrix.size();
        int n = matrix[0].size();
        int ret = 0;
        vector<vector<int>> dp(m, vector<int>(n, 0));
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                if(i == 0 || j == 0)
                	dp[i][j] = matrix[i][j] - ‘0‘;
                else if(matrix[i][j] == ‘1‘)
                {
                	dp[i][j] = 1;
                	if(dp[i-1][j-1] && dp[i][j-1] && dp[i-1][j])
                		dp[i][j] = min(min(dp[i - 1][j - 1], dp[i][j-1]),min(dp[i-1][j - 1], dp[i - 1][j])) + 1;
                }
                ret = max(ret, dp[i][j]);
            }
        }
        return ret * ret;
    }
};

上面的代码我们还可以优化到只使用一维的数组保存动态规划的中间信息,逐行更新,每一行按照从右向左的顺序计算。

  

原文地址:https://www.cnblogs.com/zjuhaohaoxuexi/p/11789236.html

时间: 2024-07-31 14:58:49

221. 最大正方形的相关文章

[leetcode] 221. 最大正方形

221. 最大正方形 其实这题是85. 最大矩形的特殊情况,我们将85题代码稍微改一下,然后直接套用即可. 此题要求是正方形,那么我们在计算长与宽时,取短的那条然后平方即可. class Solution { public int maximalSquare(char[][] matrix) { return maximalRectangle(matrix); } public int maximalRectangle(char[][] matrix) { int m = matrix.leng

[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]为右下角的最大正方形的边长 转移方

221最大正方形

题目: 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 来源: https://leetcode-cn.com/problems/maximal-square/ 法一: 自己的代码 思路: 实际上是暴力解法,先记录每个位置向上和向左的可能的正方形边长,在逐个判断是否能够构成正方形. 注意这里要判断观察出正方形的最大边长只与上边,左边,左上的格子中最大正方形的边长有关.不止与上边和左边有关!写出动态转移方程是关键 # 执行用时 :264 ms, 在所有 Pyt

[LeetCode]最大系列(最大正方形221,最大加号标志764)

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 思路: 这道题是动态规划,所以我们要找到动态方程 dp[i][j] = min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1 举个例子 1 0 1 0 0 1 0 1 1 1 1 1 1 2 2 1 0 0 1 0 代码: class Sol

矩阵与动态规划相关

目录 54/59螺旋矩阵 62不同路径 64最小路径和 120三角形最小路径和 695岛屿的最大面积 547朋友圈 718最长重复数组 221最大正方形 121/122/123/714/188买卖股票的最佳时机 416分割等和子集 01背包/最近等分子集 70爬楼梯 54/59螺旋矩阵 思路: 设置上下左右四个边界变量 新建ArrayList存储结果 循环:四个循环,左->右,上->下,右->左,下->上.每次循环添加结果,循环后判断边界是否相等了,是的话就退出 // 设置边界变量

leet

# 题名1 两数之和    2 两数相加    3 无重复字符的最长子串    4 寻找两个有序数组的中位数    5 最长回文子串    6 Z 字形变换    7 整数反转    8 字符串转换整数 (atoi)    9 回文数    10 正则表达式匹配    11 盛最多水的容器    12 整数转罗马数字    13 罗马数字转整数    14 最长公共前缀    15 三数之和    16 最接近的三数之和    17 电话号码的字母组合    18 四数之和    19 删除链表

刷题篇--热题HOT 61-70

207.课程表 现在你总共有 n 门课需要选,记为 0 到 n-1.在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习? 示例 1:输入: 2, [[1,0]],输出: true,解释: 总共有 2 门课程.学习课程 1 之前,你需要完成课程 0.所以这是可能的. 示例 2:输入: 2, [[1,0],[0,1]]输出: false,解释: 总共有 2 门课程

[LeetCode] 221. Maximal Square 最大正方形

Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and return its area. For example, given the following matrix: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 Return 4. Credits:Special thanks to @Freezen for addin

Leetcode 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 判断以某个点为正方形右下角时最大的正方形时,那它的上方,左方和左上方三个点也一定是某个正方形的右下角,否则该点为右下角的正方形最大就是它自己了.这是定性的判断,那具体的最大正方形边长呢?我们知道,该点为右下角的正方形的最大边长,最多比它的上方,左方和左上方为右下角的正方形的边长多1,最好的情