LeetCode第6292题-子矩阵元素加1-python实现-图解思路与手撕代码
一、题目描述
二、解题思路与代码实现
1.解题思路
这道题需要对一个数组从左上角(r1, c1)到右下角(r2, c2)的区域做加一操作,本题采用差分矩阵的方法解题。
创建差分矩阵diff和复原矩阵res,对于差分矩阵,只需要对左上加一,右上和左下减一,右下加一即可,即:
(r1, c1)加一。
(r2+1, c1)减一,(r1, c2+1)减一。
(r2+1, c2+1)加一
从差分矩阵复原的等式如下:
res[i+1][j+1]=res[i+1][j]+res[i][j+1]-res[i][j]+diff[i][j]
其他还有一些细节需要注意,Python二维数组的创建及遍历、数组维数改变等等。
2.代码实现
代码如下(示例):
class Solution:
def rangeAddQueries(self, n: int, queries: List[List[int]]) -> List[List[int]]:
diff=[[0]*(n+1) for _ in range(n+1)]
for r1,c1,r2,c2 in queries:
diff[r1][c1]+=1
diff[r2+1][c1]-=1
diff[r1][c2+1]-=1
diff[r2+1][c2+1]+=1
res=[[0]*(n+1) for _ in range(n+1)]
for i,arr in enumerate(diff[:n]):
for j,num in enumerate(arr[:n]):
res[i+1][j+1]=res[i+1][j]+res[i][j+1]-res[i][j]+num
del res[0]
for arr in res:
del arr[0]
return res
总结
本题重点在于差分数组和二维数组的操作处理。