Maximal Square
- 问题描述:
给定矩阵,矩阵中的元素为0或者1;
找出最大的子矩阵:该矩阵中所有的元素都为1,且为方阵。
思路
初始化一个矩阵dp,比给定矩阵行和列都大一维。且第一行和第一列都必须初始化为0;
- 然后对于原矩阵为零的地方matrix[i-1][j-1],dp[i][j]也填入0;
- 对于原矩阵为1的地方,dp[i][j]为其左dp[i-1][j]、上dp[i][j-1]、左上dp[i-1][j-1]的最小值加一
int maximalSquare(vector<vector<char> >& matrix) {
if (matrix.size()==0||matrix[0].size()==0) {
return 0;
}
int len_row = matrix.size();
int len_col = matrix[0].size();
vector<vector<int> > dp(len_row+1, vector<int> (len_col+1, 0));
int max = 0;
for (int i=1; i<len_row+1; i++) {
for (int j=1; j<len_col+1; j++) {
if (matrix[i-1][j-1]=='0') {
dp[i][j] = 0;
}
else{
dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j],dp[i][j-1]))+1;
if(max<dp[i][j]*dp[i][j])
max = dp[i][j]*dp[i][j];
}
}
}
return max;
}
以上代码,在leetcode中提交是没有问题的。
但是当我自己在xcode中运行测试时:
#include <stdio.h>
#include <vector>
#define min(x,y) x<y?x:y
using namespace std;
int maximalSquare(vector<vector<char> >& matrix) {
if (matrix.size()==0||matrix[0].size()==0) {
return 0;
}
int len_row = matrix.size();
int len_col = matrix[0].size();
vector<vector<int> > dp(len_row+1, vector<int> (len_col+1, 0));
int max = 0;
for (int i=1; i<len_row+1; i++) {
for (int j=1; j<len_col+1; j++) {
if (matrix[i-1][j-1]=='0') { //原矩阵为0的地方,dp[][]为0
dp[i][j] = 0;
}
else{ //原矩阵为1的地方,dp[][]取其左,上,左上角的最小值加一
dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j],dp[i][j-1]))+1;
if(max<dp[i][j]*dp[i][j])
max = dp[i][j]*dp[i][j];
}
}
}
return max;
}
int main(int argc, const char * argv[]) {
vector<vector<char> > test;
vector<char> t = {'1','0','1','0','0'};
test.push_back(t);
t = {'1','0','1','1','1'};
test.push_back(t);
t = {'1','1','1','1','1'};
test.push_back(t);
t = {'1','0','0','1','0'};
test.push_back(t); //可以用如是方法初始化一个二维数组
int ans = maximalSquare(test);
printf("%d\n", ans);
return 0;
}
以上代码运行结果为:1
但是正确结果为:4
为什么会出现这种情况???
归根结底是我的宏定义min有问题:
#define min(x,y) x<y?x:y
以上方式定义的min在计算三个的最小值时会出错:
min(dp[i-1][j-1], min(dp[i-1][j],dp[i][j-1]))
正确的宏定义应当为:
#define min(x,y)((x)<(y)?(x):(y))
具体原因见:
宏定义