标签:最大 int 正方形 221 边长 ans dp matrix
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;
}
};
标签:最大,int,正方形,221,边长,ans,dp,matrix 来源: https://www.cnblogs.com/alyosha/p/14646301.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。