给你一个 m x n 的矩阵 M ,初始化时所有的 0 和一个操作数组 op ,其中 ops[i] = [ai, bi] 意味着当所有的 0 <= x < ai 和 0 <= y < bi 时, M[x][y] 应该加 1。
在 执行完所有操作后 ,计算并返回 矩阵中最大整数的个数 。
示例 1:
输入: m = 3, n = 3,ops = [[2,2],[3,3]]
输出: 4
解释: M 中最大的整数是 2, 而且 M 中有4个值为2的元素。因此返回 4。
示例 2:
输入: m = 3, n = 3, ops = [[2,2],[3,3],[3,3],[3,3],[2,2],[3,3],[3,3],[3,3],[2,2],[3,3],[3,3],[3,3]]
输出: 4
示例 3:
输入: m = 3, n = 3, ops = []
输出: 9
提示:
1 <= m, n <= 4 * 104
0 <= ops.length <= 104
ops[i].length == 2
1 <= ai <= m
1 <= bi <= n
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/range-addition-ii
官方题解:
方法一:维护所有操作的交集
思路与算法
对于每一次操作,给定(a,b),我们会将矩阵中所有满足0≤i<a 以及0≤j<b 的位置 (i, j)全部加上 1。由于 a, b 均为正整数,那么 (0,0) 总是满足上述条件,并且最终位置 (0,0) 的值就等于操作的次数。
因此,我们的任务即为找出矩阵中所有满足要求的次数恰好等于操作次数的位置。假设操作次数为 k,那么 (i, j)需要满足:
等价于:
代码如下:
func maxCount(m int, n int, ops [][]int) int {
mina, minb := m, n//初始化为最大值
for _, op := range ops{//遍历ops数组
//最后,mina为最小行数,minb为最小列数
mina = min(mina, op[0])
minb = min(minb, op[1])
}
return mina * minb
}
func min(a, b int)int{
if a < b{
return a
}else{
return b
}
}