给定一个初始元素全部为 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;
}