算法:范围求和

271 阅读2分钟

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

Hope is a good thing, maybe the best of things. And no good thing ever dies.

题目

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

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

分析

每次操作都是左上角区域从(0, 0)(a, b)的矩形,必定重叠,所以找最小的 a 乘最小的 b 就行。

所有的 ops[i] 中的横纵坐标 (x,y) 与左上角 (0,0) 形成的区域面积可确保被每次操作覆盖,x∗y 就是所要的结果(亦或者说是所有操作的交集

每执行一次 operations 的元素, M * N 的二维数组,从 (0, 0)位置开始到 operations(x,y) 所表示的坐标位置执行 +1,所以最大值就是执行次数最多的二维坐标位置,operations 中最小坐标的x值 和 y值相乘就是最大值次数。

image.png

解题

var maxCount = function(m, n, ops) {
    let mina = m, minb = n;
    for (const op of ops) {
        // 获取最小坐标值
        mina = Math.min(mina, op[0]);
        minb = Math.min(minb, op[1]);
    }
    // 最大整数的元素个数
    return mina * minb;
};

结语

如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。

文章如有错误之处,希望在评论区指正🙏🙏

欢迎关注我的微信公众号,一起交流技术,微信搜索 🔍 :「 五十年以后