leetcode算法598. 范围求和 II

71 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

一、题目描述:

598. 范围求和 II - 力扣(LeetCode)

给你一个 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

二、思路分析:

输入矩形的面积可以表示该矩形中包含的元素个数。 输入矩形重叠形成的矩形部分中所包含的就必然是最大值元素。 由于输入矩形左上角重合, 因此只需要求得输入矩形中 最小的长度 和 最小的宽度 组成的矩形面积即可求得最大值元素的个数。

三、AC 代码:

class Solution {
public:
    int maxCount(int m, int n, vector<vector<int>>& ops) {
        int length = m;
        int width = n;
        for (auto &i : ops) { 
            length = min(length, i[0]);
            width = min(width, i[1]);
        }

        return length * width;
    }
};

四、参考:

近双百,取第一项中最小值和第二项中最小值,相乘即为结果 - 范围求和 II - 力扣(LeetCode)

本题就是分别找操作(二维)数组中的第一列,第二列最小值,然后输出乘积。注意ops为空的情形。 - 范围求和 II - 力扣(LeetCode)

维护一个一直加的最大区间就好了 - 范围求和 II - 力扣(LeetCode)