题目在这:https://leetcode-cn.com/problems/range-addition-ii/
法一(暴力法):
直接比较容易理解的思路,暴力法。 用于理解题目,但提交超时。
三重循环,第一重遍历需要操作的数组,后面两层遍历W矩阵中的数。
完整代码
在这里插入代码片class Solution:
def maxCount(self, m: int, n: int, ops: List[List[int]]) -> int:
M = [[0 for j in range(n)] for k in range(m)]
res = 0
print(M)
for i in ops:
a = i[0]
b = i[1]
for p in range(m):
for q in range(n):
if 0 <= p < a and 0 <= q < b:
M[p][q] +=1
res = max(res,M[p][q])
print(M)
print(res)
ans = 0
for b in M:
ans += b.count(res)
print(ans)
return ans
法二(数学法):
题中要求整个M矩阵操作完成之后的最大的数出现的次数。
我们使用例子 :
m = 3, n = 3
operations = [[2,2],[3,3]]
第一次操作 从0到2行 从0到2列的数加1,
第二次操作 从0到3行 从0到3列的数加1.
不难发现,最大的数肯定在 0-2行和0-2列的重叠区域中。因为2-3行2-3列只有在第二次操作中才加了1,所以肯定不是最大的数。
所以,每次都在有加1操作的区间,一定是所有操作区间中最小的区间。
就像下面这张图,只有蓝色区域是最小的全部重合区域。
只需要找到全部操作中的行最小值和列最小值,两者相乘即可得到答案。
完整代码
class Solution:
def maxCount(self, m: int, n: int, ops: List[List[int]]) -> int:
if len(ops) == 0:
return m * n
x = ops[0][0]
y = ops[0][1]
for r, c in ops:
x = min(x, r)
y = min(y, c)
print(y*x)
return x *y```