开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情
一、题目描述:
给你一个 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 * 10^4
- 0 <= ops.length <= 10^4
- ops[i].length == 2
- 1 <= ai <= m
- 1 <= bi <= n
二、思路分析:
此题如果去操作这个m*n的二维数组(认真)你就输了
理解题目后,并且参考官方的解法2
范围求和 II - 范围求和 II
官方的图例中是 7*7,刚开始没看懂
第一次op1操作是横过来的,第二次op2是竖过来的,什么左上角,右下角,我没明白,但不影响理解。
反正就是两次操作后,重叠的地方,也就是加过1的地方数字肯定最大的,换句话说,重叠最多的地方就是我们要的最大的数字们
那看几何图就看得出,这题就是求这重叠的地方的面积,理解后就简单了,这个面积等于 所有操作横向,竖向的最小值的乘积。
三、AC 代码:
public class Solution {
public int MaxCount(int m, int n, int[][] ops) {
foreach(var op in ops)
{
m = Math.Min(m,op[0]);
n = Math.Min(n,op[1]);
}
return m*n;
}
}
四、参考:
[Python/Java/JavaScript/Go] 看成线性的,找最小值 + 一行版本 - 范围求和 II - 力扣(LeetCode)