leetcode刷题 范围求和II

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

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

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

解题思路:

        每当进行一次操作后,二维数组中就有一个矩形区域里所有的数值增加1。这个矩形的上下距离为[0,a-1],左右距离为[0,b-1]。我们记这样的一个矩形为{a-1,b-1}。

        先分析前两步操作,假设第一步操作的两个正整数是a1和b1,第二步的两个正整数是a2和b2,则很容易可以发现,在两次操作后,矩阵中最大的整数的个数就是矩阵{a1-1,b1-1}和矩阵{a2-1,b2-1}重叠形成的新矩阵。这个新矩阵可以用{min(a1-1,a2-1),min(b1-1,b2-1}来表示。因此,在拓展到n步操作后,实际上要求的便是{min(a1-1,a2-1……an-1),min(b1-1,b2-1……bn-1)}这个矩阵中元素的个数。

代码如下:

    public int maxCount(int m, int n, int[][] ops) {
        if(ops.length==0) return m*n;
        int maxRowNumber=Integer.MAX_VALUE,maxCloNumber=Integer.MAX_VALUE;
        for (int i = 0; i <ops.length ; i++) {
            maxRowNumber=Math.min(maxRowNumber,ops[i][0]);
            maxCloNumber=Math.min(maxCloNumber,ops[i][1]);
        }
        return maxCloNumber*maxRowNumber;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值