题目:
思路:
这题是动态规划,但是不会写。想着判断dp的 <上,左,左上> 去了。发现只能这样最大只能判断面积为4的正方形因为只会判断另外三个方格。而要想判断更大的正方形那就需要递归操作了。那肯定会超时了。
好吧,只能看答案了。
正方形的面积的长乘宽。在例子中我们可以看到有一个长方形。但是我们只取短的边作为正方形的边。所以dp是取最小值。
代码是:
//code
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
if (matrix.empty()) {
return 0;//当vector是空的时候返回0
}
int m = matrix.size(), n = matrix[0].size();//m是矩阵的行 n是列
vector<vector<int>> dp(m, vector<int>(n, 0));//创建m行 n列的二维数组并且值都是0
int ans = 0;//初始化ans
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == '1') {//遍历矩阵,当矩阵的值为1时才进行动态规划.
if (i == 0 || j == 0) {//当处在边缘时.值只能为1.
dp[i][j] = 1; //因为取的正方形是以右下角向前面进行相加.
} else {
dp[i][j] = min({dp[i-1][j], dp[i][j-1], dp[i-1][j-1]}) + 1;//获得边长.
}
ans = max(ans, dp[i][j]);//获得最大的边长.
}
}
}
return ans * ans;//返回面积
}
};
在获得边长这一部中,我们取三个点 是 左, 上, 左上. 因为原本可能是长方形
以蓝色的点为例子.
此时 i-1,j 点是2, i , j-1点是2 而i-1,j-1点是1.取最小值然后加一 得到matrix中最大的正方形边为2.文章来源:https://www.toymoban.com/news/detail-611967.html
结果为4; 文章来源地址https://www.toymoban.com/news/detail-611967.html
到了这里,关于LeetCode221.Maximal-Square<最大正方形>的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!