Submatrix Sum

Given an integer matrix, find a submatrix where the sum of numbers is zero. Your code should return the coordinate of the left-up and right-down number.

Example

Given matrix

[
  [1 ,5 ,7],
  [3 ,7 ,-8],
  [4 ,-8 ,9],
]

return[(1,1), (2,2)]

分析

subarray sum的matrix变种

presum的计算法:此处是每一列的sum

sumY[i][j] = i-1 < 0 ? 0 : sumY[i-1][j] + matrix[i][j];

矩阵和的计算法:以x,y为终点的方块面积,计算时候外面左边和上面包一层0。

  1. 先求每一列的和,然后在此基础上求每一行的和,就是以xy结尾的矩阵和。

sumY[i][j] = i-1 < 0 ? 0 : sumY[i-1][j] + matrix[i][j];
sum[i][j] = sum[i][j-1] + sumY[i-1][j-1];

2.左边+上面-重合部分+当前点matrix[i][j]

sum[i+1][j+1] = matrix[i][j] + sum[i+1][j] + sum[i][j+1] - sum[i][j];

代码说明:预处理得到以0,0为起点,x,y为终点的矩阵和,x轴上设置low,high,然后遍历y轴j,得到以0为起点,j轴为终点的矩形面积。

用Hashmap存储以0轴为起点,y轴为终点,low和high内切的矩形面积。如果下一次再遇到这个面积,说明中间有一段包含的面积是0。

tricky点:结果里起点左边直接用,终点坐标都要-1

答案

注释的部分是另一种矩阵和的做法。

Last updated

Was this helpful?