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.
寻找最大矩形。想到应该用DP,但是还没想到应该怎么用。
突然想到之前做过找最大长方形的,也可以用类似的方法。想想不行。
然后想想利用dp[i][j]和dp[i-1][j-1]的关系也是可行的。

class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        int m = matrix.size();
        if (m == 0)
            return 0;
        int n = matrix[0].size();
        vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
        for (int i=1; i<=m; i++)
            for (int j=1; j<=n; j++) {
                if (matrix[i-1][j-1] == '0')
                    dp[i][j] = 0;
                else {
                    dp[i][j]++;
                    for (int k=1; k<=dp[i-1][j-1]; k++) {
                        if (matrix[i-k-1][j-1] != '1' || matrix[i-1][j-k-1] != '1')
                            break;
                        dp[i][j]++;
                    }
                }
            }
        int res = 0;
        for (int i=1; i<=m; i++)
            for (int j=1; j<=n; j++)
                res = max(res, dp[i][j] * dp[i][j]);
        return res;
    }
};

看了看讨论区,发现可以改进,直接如下:

class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        int m = matrix.size();
        if (m == 0)
            return 0;
        int n = matrix[0].size();
        int res = 0;
        vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
        for (int i=1; i<=m; i++)
            for (int j=1; j<=n; j++) {
                if (matrix[i-1][j-1] == '0')
                    dp[i][j] = 0;
                else {
                    dp[i][j] = min(dp[i-1][j-1] + 1, min(dp[i-1][j], dp[i][j-1]) + 1);
                    res = max(res, dp[i][j] * dp[i][j]);
                }
            }
        return res;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,769评论 0 33
  • 导论 (一) 一个人此生的主要任务就是自我成长,去成为他潜能所向的那个人。 ——Erich Fromm(美籍德裔犹...
    DorogoyMoy阅读 575评论 0 0
  • 第一部分,配置项目 在此只讲纯手打拉第三方框架的方法,Pods的自行百度哦!不懂Pods的可以点击传送传送门首先我...
    Bison阅读 14,800评论 15 39
  • 你给出的解释好肤浅,这个谎,我就看你怎么圆;你难过的情绪太表面,亲爱的,你没天赋还学人家表演? 本着好聚好散的原则...
    我们之间12138阅读 218评论 0 0