LeetCode 221 Maximal Square 题解
2017-06-13 21:08
323 查看
题意简述:给定一个由0和1组成的二维矩阵,找到其中只包含1的最大正方形。
输入:char类型二维矩阵matrix
输出:最大正方形的面积
示例:对于以下矩阵,所能找到的最大正方形用加粗表示,其面积为4。
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
题解:
采用动态规划,考虑求解以点(i,j)作为右下角所能找到的正方形最大边长。
边界情况是最上方的行和最左边的列,如果matrix[i][j]的值为0,则不存在这样的正方形,边长为0;如果为1,则边长为1(受边界影响无法再扩大正方形)。
dp(i,j)=matrix[i][j]−′0′ (当点位于左边界和上边界)
对于非边界情况,如果matrix[i][j]的值为0,则不存在这样的正方形,边长为0;如果为1,需要考虑正上方点(i-1,j)和正左方点(i,j-1)这两个点的最大边长,点(i,j)的最大边长受限于这两者更小的那个,有两种情况((i-1,j)和(i,j-1)的最大正方形用蓝色实线框标出,(i,j)的最大正方形用红色虚线框标出):
实际上两种情况可以合并,它们都是先求出更小的最大边长min(dp(i−1,j),dp(i,j−1))(记为temp),然后观察点(i-temp,j-temp)的值以决定这个边长temp是否可以+1。
temp=min(dp(i−1,j),dp(i,j−1))
当 matrix[i][j]==′0′, dp(i,j)=0
当 matrix[i][j]==′1′, dp(i,j)=temp+(matrix[i−temp][j−temp]−′0′))
由于dp(i,j)的值只依赖于正上方和正左方的值,所以可以在空间上进一步优化,dp可以用一维数组表示而非二维数组。dp的值使用第一行初始化,然后逐行求解dp,每处理一行后,如果dp的最大值与之前得到的最大值比较更大,就更新最大值。
对于非边界情况而且matrix[i][j]的值为1,新的状态转移方程是
temp=min(dp(j),dp(j−1))
dp(j)=temp+(matrix[i−temp][j−temp]−′0′)
算法的时间复杂度是O(m*n)(二维矩阵的规模),空间复杂度是O(n)。
输入:char类型二维矩阵matrix
输出:最大正方形的面积
示例:对于以下矩阵,所能找到的最大正方形用加粗表示,其面积为4。
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
题解:
采用动态规划,考虑求解以点(i,j)作为右下角所能找到的正方形最大边长。
边界情况是最上方的行和最左边的列,如果matrix[i][j]的值为0,则不存在这样的正方形,边长为0;如果为1,则边长为1(受边界影响无法再扩大正方形)。
dp(i,j)=matrix[i][j]−′0′ (当点位于左边界和上边界)
对于非边界情况,如果matrix[i][j]的值为0,则不存在这样的正方形,边长为0;如果为1,需要考虑正上方点(i-1,j)和正左方点(i,j-1)这两个点的最大边长,点(i,j)的最大边长受限于这两者更小的那个,有两种情况((i-1,j)和(i,j-1)的最大正方形用蓝色实线框标出,(i,j)的最大正方形用红色虚线框标出):
实际上两种情况可以合并,它们都是先求出更小的最大边长min(dp(i−1,j),dp(i,j−1))(记为temp),然后观察点(i-temp,j-temp)的值以决定这个边长temp是否可以+1。
temp=min(dp(i−1,j),dp(i,j−1))
当 matrix[i][j]==′0′, dp(i,j)=0
当 matrix[i][j]==′1′, dp(i,j)=temp+(matrix[i−temp][j−temp]−′0′))
由于dp(i,j)的值只依赖于正上方和正左方的值,所以可以在空间上进一步优化,dp可以用一维数组表示而非二维数组。dp的值使用第一行初始化,然后逐行求解dp,每处理一行后,如果dp的最大值与之前得到的最大值比较更大,就更新最大值。
对于非边界情况而且matrix[i][j]的值为1,新的状态转移方程是
temp=min(dp(j),dp(j−1))
dp(j)=temp+(matrix[i−temp][j−temp]−′0′)
算法的时间复杂度是O(m*n)(二维矩阵的规模),空间复杂度是O(n)。
class Solution { public: int maximalSquare(vector<vector<char>>& matrix) { if(matrix.size() == 0) return 0; int row = matrix.size(), col = matrix[0].size(); int res = 0; vector<int> dp(col, 0); // first row for(int i = 0;i < col;i++) dp[i] = matrix[0][i] - '0'; res = max(res, *max_element(dp.begin(), dp.end())); // dp for(int i = 1;i < row;i++) { // first col dp[0] = matrix[i][0] - '0'; // other cols for(int j = 1;j < col;j++) { if(matrix[i][j] == '1') { int temp = min(dp[j], dp[j-1]); dp[j] = temp + (matrix[i-temp][j-temp] - '0'); } else { dp[j] = 0; } } res = max(res, *max_element(dp.begin(), dp.end())); } return res * res; } };
相关文章推荐
- leetcode每日解题思路 221 Maximal Square
- LeetCode(221) Maximal Square
- Leetcode--221--Maximal Square
- LeetCode(221) Maximal Square
- LeetCode221:Maximal Square
- leetcode221 Maximal Square
- LeetCode: 221_Maximal Square | 二维0-1矩阵中计算包含1的最大正方形的面积 | Medium
- 【LeetCode 221】Maximal Square
- LeetCode 221 Maximal Square
- leetcode 221: Maximal Square
- LeetCode - 221 - Maximal Square
- leetcode085_221:Maximal Rectangle&Maximal Square
- Leetcode: Maximal Square
- [LeetCode] Maximal Square
- LeetCode之“动态规划”:Maximal Square && Largest Rectangle in Histogram && Maximal Rectangle
- leetcode题解分析_221. Maximal Square(图文分析)
- [LeetCode] Maximal Square
- Maximal Square - LeetCode
- LeetCode Maximal Square
- Leetcode: Maximal Square