首页 > 其他 > 详细

221. 最大正方形

时间:2021-04-12 09:15:33      阅读:18      评论:0      收藏:0      [点我收藏+]

221. 最大正方形

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

示例 1:
技术分享图片

输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:4

动态规划

  • 本题需要仔细考虑的是dp数组代表的含义。
  • 首先题目中寻找的是正方形,因此我们可以寻找正方形的边长即可。
  • 二维dp数组,\(dp[i][j]\)代表\((i,j)\)为右下角的最大正方形边长。(稍微有点难想到。。)
  • 更新方程:若当前\(matrix[i][j] == ‘1‘\),判断可否延长该正方形,这根据上方,左上,左方的最短边长决定,i.e.,
  • \(min(dp[i-1][j], dp[i-1][j-1], dp[i][j-1])\)
  • 最后注意边界条件,第一行与第一列。然后寻找dp数组中的最大元素及对应最大边长。
class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        // 正方形,因此寻找边长即可
        // dp[i][j], 表示以i,j为右下角的正方形边长。
        // dp[i-1][j], dp[i-1][j-1], dp[i][j-1]中最短的边长, 再加上matrix[i][j]
        int m = matrix.size(), n = matrix[0].size(), ans = 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)
                    dp[0][j] = (matrix[0][j] == ‘1‘); 
                else if(!j)
                    dp[i][0] = (matrix[i][0] == ‘1‘);
                // 更新方程
                else if( matrix[i][j] == ‘1‘){
                    int tmp = min(dp[i-1][j], dp[i][j-1]);
                    dp[i][j] = min(tmp, dp[i-1][j-1]) + 1;    
                }
                ans = max(ans, dp[i][j]);
            }
        }
        return ans*ans;
    }
};

221. 最大正方形

原文:https://www.cnblogs.com/alyosha/p/14646301.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!