LeetCode 598. 范围求和 II

目录结构

1.题目

2.题解


1.题目

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

操作用二维数组表示,其中的每个操作用一个含有两个正整数 a 和 b 的数组表示,含义是将所有符合 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。

注意:

  1. m 和 n 的范围是 [1,40000]。
  2. a 的范围是 [1,m],b 的范围是 [1,n]。
  3. 操作数目不超过 10000。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/range-addition-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2.题解

  • 元素最大的位置即+1次数最多的位置,也就是锁定在左上角,因此找到最小的长和宽即可。
  • 注意若没有任何操作,则最大的数为m*n。
public class Solution598 {

    @Test
    public void test598() {
        int[][] ops = {{2, 2}, {3, 3}};
        System.out.println(maxCount(3, 3, ops));
    }

    public int maxCount(int m, int n, int[][] ops) {
        if (ops.length  == 0){
            return m*n;
        }
        int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
        for (int[] op : ops) {
            min1 = Math.min(min1, op[0]);
            min2 = Math.min(min2, op[1]);
        }
        return min1 * min2;
    }
}
  • 时间复杂度:O(n),n为操作个数,即ops.length。
  • 空间复杂度:O(1)

你可能感兴趣的:(LeetCode,leetcode)