《Big Plus》题目分析
解决本题需要使用一个经典的优化技巧:前缀和。
对于矩阵中每一个位置(i, j),我们可以计算up[i][j]
, down[i][j]
, left[i][j]
, right[i][j]
,一次是从(i, j)开始,向上下左右四个方向最多能延伸出多少连续的1。
如果A[i][j]=0
,则up[i][j]=down[i][j]=left[i][j]=right[i][j]=0
利用类似前缀和的技巧,否则有递推式:
up[i][j] = up[i - 1][j] + 1
down[i][j] = down[i + 1][j] + 1
left[i][j] = left[i][j - 1] + 1
right[i][j] = right[i][j + 1] + 1
我们可以先从上到下,从左到右计算出up[i][j]
和left[i][j]
,再反向计算出down[i][j]
和right[i][j]
。时间复杂度是O(N^2)
。
最后对于每个(i, j),up[i][j]
, down[i][j]
, left[i][j]
, right[i][j]
的最小值就是以(i, j)为中心的Plus的size。所有(i, j)的最大值就是答案。