最笨的一种方法,一行行遍历,找matrix[i][j]为1,往右找到连续的max_l个1,就假定最大正方形的边长是max_l,然后从j列i行往下遍历到i+max_l,如果中间有0,说明正方形边长要变短,更新边长max_l。之后遍历matrix[i+1][j+1]到matrix[i+max_l][j+max_l],中间matrix[m][n]为0需要根据matrix[m][n]到matrix[i][j]较长的部分修正max_l。
import java.util.*;
public class Solution {
/**
* 最大正方形
* @param matrix char字符型二维数组
* @return int整型
*/
public int solve (char[][] matrix) {
// write code here
int max_l = 0;
int max_lr = 0;
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[i].length; j++){
if (matrix[i][j] == '1'){
int k = j + 1;
for (k = j + 1; k < matrix[i].length; k++){
if (matrix[i][k] == '0'){
break;
}
}
max_l = k - j;
if (max_l < max_lr){
continue;
}
int l = i + 1;
for(l = i + 1; (l < i + max_l) && (l < matrix.length); l++) {
if (matrix[l][j] == '0'){
break;
}
}
max_l = l - i;
if (max_l < max_lr){
continue;
}
for (int m = i + 1; (m < i + max_l) && (m < matrix.length); m++){
for(int n = j + 1; (n < j + max_l) && (n < matrix[m].length); n++){
if (matrix[m][n] == '0') {
max_l = (m - i > n - j) ? m - i : n - j;
if (max_l < max_lr){
continue;
}
}
}
}
if (max_lr < max_l) {
max_lr = max_l;
}
}
}
}
return max_lr*max_lr;
}
}
这个题目有进阶的方法,题目提示了时间空间复杂度都是n^2,方法是动态规划,目前有一点点的思路。
当前思路:
1、如果确定a[i][j]到a[i+n][j+n]都是1,那么在a[i+n+1][j+n+1]时只需要确定a[i+n+1][j]到a[i+n+1][j+n+1]和a[i][j+n+1]到a[i+n+1][j+n+1]是1,就可以确定a[i][j]到a[i+n+1][j+n+1]都是1。不需要重复遍历。
2、确定a[i+n+1][j]到a[i+n+1][j+n+1]是1,如果可以确定a[i+n+1][j]到a[i+n+1][j+n]是1,那么只需要判断a[i+n+1][j+n+1]是否为1。a[i][j+n+1]到a[i+n+1][j+n+1]同理。
3、用数组记录每个点上面连续的1的个数up,左边连续的1的个数left,以及以当前节点为终点的正方形边长edge。a[i][j]为0时,记录为(0,0,0),否则记录为(a[i-1][j].left+1,a[i][j-1].right+1,edge),若a[i-1][j-1].edge是0,则a[i][j].edge=1,否则,a[i][j]的edge需要根据情况计算。
情况一:a[i][j].left>edge && a[i][j].right>edge edge=a[i][j].edge+1
情况二:edge=min(a[i][j].left,a[i][j].right)
例如: 最终结果是:
[[1,0,1,0,0], [[(1,1,1),(0,0,0),(1,1,1),(0,0,0),(0,0,0)],
[1,0,1,1,1], [(1,2,1),(0,0,0),(1,2,1),(2,1,1),(3,1,1)],
[1,1,1,1,1], [(1,3,1),(2,1,1),(3,3,1),(4,2,2),(5,2,2)],
[1,0,0,1,0]], [(1,4,1),(0,0,0),(0,0,0),(1,3,1),(0,0,0)]]
最终边长为edge_max,在循环的过程中,将(left,up)中较小的值比如up较小,且up>edge_max,则edge_max=up
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 最大正方形 # @param matrix char字符型二维数组 # @return int整型 # class Solution: def solve(self , matrix: List[List[str]]) -> int: # write code here result_mix=[] edge_max = 0 for i in range(len(matrix)): r = [] for j in range(len(matrix[i])): obje = {'left':0,'up':0,'edge':0} if matrix[i][j] == '0': r.append(obje) else: if i == 0 and j == 0: obje = {'left':1,'up':1,'edge':1} elif i == 0 and j > 0: obje = {'left':r[j-1]['left'] + 1,'up':1,'edge':1} elif j == 0 and i > 0: obje = {'left':1,'up':result_mix[i-1][j]['up'] + 1,'edge':1} else: obje = {'left':r[j-1]['left'] + 1,'up':result_mix[i-1][j]['up'] + 1,'edge':result_mix[i-1][j-1]['edge']} if obje['left'] > obje['edge'] and obje['up'] > obje['edge']: obje['edge'] = obje['edge'] + 1 else: if obje['left'] > obje['up']: obje['edge'] = obje['up'] else: obje['edge'] = obje['left'] if obje['edge'] > edge_max: edge_max = obje['edge'] r.append(obje) result_mix.append(r) return edge_max*edge_max
很奇怪,两种方法下面的耗时更长,上面的占用的空间更多

京公网安备 11010502036488号