• LeetCode题解 | [简单-数组] 598. 范围求和 II


    598. 范围求和 II

    题目

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

    操作用二维数组表示,其中的每个操作用一个含有两个正整数 a 和 b 的数组表示,含义是将所有符合 0 <= i < a 以及 0 <= j < b 的元素 M[i][j] 的值都增加 1。

    在执行给定的一系列操作后,你需要返回矩阵中含有最大整数的元素个数。

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

    注意:

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

    思路

    1. 暴力法(超时)
    2. 分析操作范围的规律,求最小交集的范围,每个操作对最小交集里的元素的贡献均为1,因此最大元素就是最小交集里的元素,个数为最小交集的行数*列数。

    代码

    //暴力法超时
    class Solution {
    public:
        int maxCount(int m, int n, vector<vector<int>>& ops) {
            const int opsNum = ops.size();
            vector<int> iner(n, 0);
            vector<vector<int>> M(m, iner);
            
            for (int k = 0; k < opsNum; k++) {
                int a = ops[k][0];
                int b = ops[k][1];
                for (int i = 0; i < a; i++) {
                    for (int j = 0; j < b; j++) {
                        ++M[i][j];
                    }
                }
            }
            int max = 0;
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    max = (M[i][j] > max) ? M[i][j] : max;
                }
            }
    
            int cnt = 0;
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    cnt += (M[i][j] == max) ? 1 : 0;
                }
            }
    
            return cnt;
        }
    };
    
    //Accepted
    class Solution {
    public:
        int maxCount(int m, int n, vector<vector<int>>& ops) {
            const int opsNum = ops.size();
    
            int minA = m;
            int minB = n;
    
            for (int k = 0; k < opsNum; k++) {
                minA = (ops[k][0] < minA) ? ops[k][0] : minA;
                minB = (ops[k][1] < minB) ? ops[k][1] : minB;
            }
    
            return minA*minB;
        }
    };
    
  • 相关阅读:
    『C#基础』C#读写TXT文档
    『ExtJS』给 Panel Items 中的 Grid 更新数据
    『Spring.NET』常见错误整理(持续更新)
    『WPF』Timer的使用
    『WPF』使用 [Annotation] 注释来定制数据/实体类
    『WPF』DataGrid的使用
    vbs修改注册表
    利用C#重启远程计算机
    sql server2000创建表和修改表
    存储过程得到某个表的所有字段信息
  • 原文地址:https://www.cnblogs.com/DylanLiuH2O/p/14398071.html
Copyright © 2020-2023  润新知