598. 范围求和 II

405 阅读1分钟

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

题目

给定一个初始元素全部为 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

思路分析

这题都不用看就知道是前缀和或者差分那一系列的东西,不过突然注意到题目中给出的一句话

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

那可能不用那么麻烦,具体思路就是找到二维数组中给到的最小交集(比如说[1,1][1,3][3,1]这种的交集就是1了)的大小就可以了。

因为这道题本身蕴含着一种单调性,就是无论怎么操作,(0,0)位置的元素都会加1,因此最小交集的每个元素一定是在任何操作中都出现过的元素。

int maxCount(int m, int n, vector<vector<int>>& ops) {
        if (ops.size() == 0)return m * n;
        int xi = ops[0][0], yi = ops[0][1];
        for(int i = 0; i < ops.size(); i++){
            int x = ops[i][0], y = ops[i][1];
            xi = min(x, xi);
            yi = min(y, yi);
        }
        return xi * yi;
    }

就离谱,非要出个空二维数组卡一下,力扣也是没谁了