力扣-598. 区间加法 II
1.题目
题目地址(598. 区间加法 II - 力扣(LeetCode))
https://leetcode.cn/problems/range-addition-ii/
题目描述
给你一个 m x n
的矩阵 M
和一个操作数组 op
。矩阵初始化时所有的单元格都为 0
。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
2.题解
2.1 简单模拟
思路
首先由于a,b均为正值(不存在0), 所以[0,0]每次都会被算在内, 执行完op后, [0,0]所在的值就是最大值也就是执行次数
然后我们就思考是最大值的元素个数?每次都能被计算在内?那我们不是找到op中x,y的最小值(保证每次op都被计算到), 然后 x*y 即可解决问题?
然后进行简单模拟即可, 注意下这里a不可能大于m, b不可能大于n, 这样就好设置初始值了.
代码
- 语言支持:C++
C++ Code:
class Solution {
public:
int maxCount(int m, int n, vector<vector<int>>& ops) {
int a = m, int b = n;
if(ops.empty()) return m * n;
for(auto &op: ops){
a = min(a, op[0]);
b = min(b, op[1]);
}
return a * b;
}
};
复杂度分析
令 n 为数组长度。
- 时间复杂度:\(O(n)\)
- 空间复杂度:\(O(n)\)