「leetcode算法」598.范围求和 II

126 阅读2分钟

这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战

一、题目

598.范围求和 II

给你一个 m x n 的矩阵 ,初始化时所有的 0 和一个操作数组 op ,其中 ops[i] = [ai, bi] 意味着当所有的0 <= x < ai0 <= y < bi 时, M[x][y] 应该加 1

在 执行完所有操作后 ,计算并返回 矩阵中最大整数的个数 。

ex1.jpeg

示例 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 * 104
0 <= ops.length <= 104
ops[i].length == 2
1 <= ai <= m
1 <= bi <= n

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ra…

二、分析解题思路

思路一

首先来读题目:

  • 给定一个m*n的二维数组M,每项的值初始化是0
  • 再给定一个操作的数组:op,也是一个二维数组
  • op中的ops[i] = [ai, bi],当所有的0 <= x < ai0 <= y < bi 的时候时, M[x][y] 应该加 1。

综上:每一次的操作,给定一个(a,b),遍历,将M矩阵中的所有满足 0<= i <= a0<= j <=b的位置即(i,j)全部加上1。

因为a,b都是正数,所以(0,0)总是满足条件,并且最终位置(0,0)的数值就等于操作的次数。

所以,我们的任务就等价于找出M矩阵中所有满足要求的次数刚好等于操作次数的位置。

假设:k,那么(i,j)就需要满足以下调价

{ 0<= i <= a0, 0<= i <= a1,···,0<= i <= ak-1
{ 0<= j <= b0, 0<= j <= b1,···,0<= j <= bk-1

等价于:

{ 0<= i <= mink(a)
{ 0<= j <= mink(b)

这样,我们就只需要求出ab中的最小值,分别标记为mink(a)mink(b),所以满足(1)式的(i,j)一共有 minka * minkb对。

三、JS代码

3.1 思路一:维护所有操作的交集

/**
 * @param {number} m
 * @param {number} n
 * @param {number[][]} ops
 * @return {number}
 */
 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]);
        console.log("op:",op)
        console.log("op[0]: ",op[0]," op[1]: ",op[1])
        console.log("mina: ",mina," minb: ",minb)
    }
    return mina * minb;
};

let m = 3, n = 3, ops=[[2,2],[3,3]];
let result = maxCount(m,n,ops);
console.log(result)

复杂度:

时间复杂度:O(k),其中k是数组ops的长度

空间复杂度:O(1)