程序员面试金典——18.11最大子方阵
Solution1:我的答案。最笨的方法,时间复杂度是 O(n3) O ( n 3 )
class SubMatrix {
public:
int maxSubMatrix(vector<vector<int> > mat, int n) { //穷举法??复杂度有点高欧~
// write code here
int l = n;
while(l) { //l是目前方形边长
for(int i = 0; i + l - 1 < n ; i++) { // i 相当于 x1;
for(int j = 0; j + l - 1 < n; j++) { //j相当于y1
if(Judge_same_color(mat, i, j, j + l - 1)) {
return l;
break;
}
}
}
l--;
if(l == 1)
break;
}
return 1;
}
//判断矩形是否同色
bool Judge_same_color(vector<vector<int> > &mat, int x1, int y1, int y2) {
bool res = false;
int length = y2 - y1; //length = 方形边长 - 1
if(mat[x1][y1] == mat[x1][y2]
== mat[x1 + length][y1]
== mat[x1 + length][y2]) {
for(int i = 1; i <= length; i++) {
if(mat[x1][y1 + i] != mat[x1][y1]
|| mat[x1 + length][y1 + i] != mat[x1 + length][y1]
|| mat[x1 + i][y1] != mat[x1][y1]
|| mat[x1 + i][y2] != mat[x1][y2])
return false;
}
return true;
}
return res;
}
};
Solution2:
参考网址:
https://www.nowcoder.com/practice/008759ec032e44c6b615f7b6a5b752aa?tpId=8&tqId=11074&tPage=5&rp=4&ru=%2Fta%2Fcracking-the-coding-interview&qru=%2Fta%2Fcracking-the-coding-interview%2Fquestion-ranking
网站中,有几个答案也是我的方法(毕竟都很ben),但有个java代码提到了动态规划,看来更快的方法就是DP了。