598. 区间加法 II(C++)

题目

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

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

示例 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

题解

int maxCount(int m, int n, vector<vector<int>>& ops) {  
    if (ops.empty()) {  
        // 如果没有操作,则所有元素都是0,最大整数的个数就是矩阵的面积  
        return m * n;  
    }  
  
    // 初始化最小值为矩阵的维度  
    int min_a = m, min_b = n;  
  
    // 遍历操作数组,找到最小的ai和bi  
    for (const auto& op : ops) {  
        min_a = min(min_a, op[0]);  
        min_b = min(min_b, op[1]);  
    }  
  
    // 最大整数的个数就是左上角(0, 0)到(min_a-1, min_b-1)的矩形区域的面积  
    return min_a * min_b;  
} 

算法原理

这段代码的算法原理相对直观,主要涉及到遍历一个二维向量(vector<vector<int>>)来寻找特定维度(在这个例子中是aibi)的最小值。这里,我们假设ops是一个vector<vector<int>>,其中每个内部vector<int>都恰好包含两个元素,分别代表aibi

  1. 初始化:首先,将min_amin_b初始化为矩阵的维度mn。这是一个保守的起始值,因为我们知道实际的aibi值(即操作的范围)一定不会超过矩阵的维度。然而,在实际操作中,aibi很可能会远小于mn
  2. 遍历操作:然后,代码遍历ops容器中的每个操作(即每个内部vector<int>)。对于每个操作,它检查op[0](即ai)和op[1](即bi)的值,并将它们与当前的min_amin_b进行比较。
  3. 更新最小值:如果当前操作的ai小于min_a,则更新min_a为当前ai的值。同样地,如果当前操作的bi小于min_b,则更新min_b为当前bi的值。这个过程确保了min_amin_b在遍历结束时分别包含所有操作中aibi的最小值。
  4. 计算结果:最后,代码通过计算min_a * min_b来得到最终矩阵中最大整数的个数。这是因为所有操作都会覆盖矩阵的左上角区域,直到(min_a-1, min_b-1)这个位置。由于每个被覆盖的位置的值都会增加(在这个问题中,由于我们只关心最大整数的个数,而不关心具体的值是多少),因此这个矩形区域内的所有元素都将具有相同的最大值(即被覆盖的次数)。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值