代码模板
首先处理原来的数组,生成二位前缀和数组
m,n=len(mat),len(mat[0])P=[[0 for i in range(n+1)] for j in range(m+1)]for i in range(1,m+1):for j in range(1,n+1):P[i][j]=P[i-1][j]+P[i][j-1]+mat[i-1][j-1]-P[i-1][j-1]
定义计算范围内元素和的函数
def areaRect(x1,y1,x2,y2):return P[x2][y2]-P[x1-1][y2]-P[x2][y1-1]+P[x1-1][y1-1]
进行循环遍历处理,这里可以形成自己的思维。
因为二维前缀和数组的维度比原数组大①,所以容易产生混淆:- 在遍历数组的时候,我们都使用在原来数组中的坐标
- 如果涉及到边长,我们使用真实边长;注意新的位置有时需要减一
i+r-1 - 传入二维前缀和数组的时候,再把每一个位置都加上①
# 1314 矩阵和# i - K <= r <= i + K, j - K <= c <= j + Kfor i in range(m):for j in range(n):right_x=i+K if i+K<m else m-1right_y=j+K if j+K<n else n-1left_x=i-K if i-K>=0 else 0left_y=j-K if j-K>=0 else 0#左侧+1就从1开始了,这样还对吗?#还是正确的,这样的思路更容易想到#找到原来的位置,然后+1修改成我们的增广矩阵的位置mat[i][j]=areaRect(left_x+1,left_y+1,right_x+1,right_y+1)
# 1292 正方形区域的最大边长maxR,r=min(m,n),0for i in range(m):for j in range(n):for c in range(r+1,maxR+1):#还是使用原来矩阵和新矩阵的映射#在传入函数中计算之前都是原来矩阵if i+c-1<m and j+c-1<n and areaRect(i+1,j+1,i+c,j+c)<=threshold:r+=1else:break
