算法笔记 -- 598. 范围求和 II

91 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情

一、题目描述:

598. 范围求和 II

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

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

示例 1:

image.png

输入: 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 * 10^4
  • 0 <= ops.length <= 10^4
  • ops[i].length == 2
  • 1 <= ai <= m
  • 1 <= bi <= n

二、思路分析:

  1. 定义s为mn,默认所有元素都是最大值(mn),s是为了拿到横向最小的数
  2. 如果ops数组为空,返回s
  3. for循环遍历数组ops 三元判断s是否小于ops第i个子数组的第0个元素,将最小值赋值给s
  4. 定义k为mn,默认所有元素都是最大值,k是为了拿到纵向最小的数
  5. for循环遍历数组ops 三元判断k是否小于ops第i个子数组的第0个元素,将最小值赋值给s
  6. 返回结果sk

三、AC 代码:

/**
 * @param {number} m
 * @param {number} n
 * @param {number[][]} ops
 * @return {number}
 */
var maxCount = function(m, n, ops) {
    //定义s为m*n,默认所有元素都是最大值,s是为了拿到横向最小的数
    let s = m*n
    //如果ops数组为空,返回s
    if(ops.length == 0){return s}
    //for循环遍历数组ops
    for(let i = 0;i<ops.length;i++){
        //三元判断s是否小于ops第i个子数组的第0个元素,将最小值赋值给s
        s = s < ops[i][0] ? s : ops[i][0]
    }
    //定义k为m*n,默认所有元素都是最大值,k是为了拿到纵向最小的数
    let k = m*n
    //for循环遍历数组ops
    for(let j = 0;j<ops.length;j++){
        //三元判断k是否小于ops第i个子数组的第0个元素,将最小值赋值给s
        k = k < ops[j][1] ? k : ops[j][1]
    }
    //返回结果s*k
    return s * k
};