leetcode每日一题系列-范围求和II-「数学模拟」

439 阅读1分钟

「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

leetcode-598-范围求和

[博客链接]

菜🐔的学习之路

掘金首页

[题目链接]

题目链接

[github地址]

暂时没有地址哦还,周一给!

[题目简介]

给定一个初始元素全部为 0,大小为 m*n 的矩阵 M 以及在 M 上的一系列更新操作。

操作用二维数组表示,其中的每个操作用一个含有两个正整数 a 和 b 的数组表示,含义是将所有符合 0 <= i < a 以及 0 <= j < b 的元素 M[i][j] 的值都增加 1。

在执行给定的一系列操作后,你需要返回矩阵中含有最大整数的元素个数。

示例 1:

输入: m = 3, n = 3 operations = [[2,2],[3,3]] 输出: 4 解释: 初始状态, M = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

执行完操作 [2,2] 后, M = [[1, 1, 0], [1, 1, 0], [0, 0, 0]]

执行完操作 [3,3] 后, M = [[2, 2, 1], [2, 2, 1], [1, 1, 1]]

  • M 中最大的整数是 2, 而且 M 中有4个值为2的元素。因此返回 4。 注意:

  • m 和 n 的范围是 [1,40000]。

  • a 的范围是 [1,m],b 的范围是 [1,n]。

  • 操作数目不超过 10000。

思路一:数学模拟

  • 简单题还是很简单的
  • 首先分析操作(x,y)的作用是将以(0,0)和(x,y)为对角坐标的矩形内的点+1
  • 也就是说操作完成后数值最大的点的个数是覆盖次数最多的矩形的面积
  • 便利所有数组,得到x,y的最小值即可
class Solution {
    public int maxCount(int m, int n, int[][] ops) {
            int minx  = m, miny = n;
            for(int [] op: ops){
                minx = Math.min(minx,op[0]);
                miny = Math.min(miny,op[1]);
            }
            return minx * miny;
    }
}
  • 时间复杂度O(n),n为ops的长度
  • 空间复杂度O(1)

美好的简单题总是让人心情愉悦,不过这种题确实也没什么提升价值,建议大家还是努力做Hard