Given an mn matrix M initialized with all 0's and several update operations.
Operations are represented by a 2D array,
and each operation is represented by an array with two positive integers a and b,
which means M[i][j] should be added by one for all 0<= i < a and 0<= j < b.
You need to count and return the number of maximum integers in the matrix after performing all the operations.
Example 1:
Input:
m =3, n =3
operations =[[2,2],[3,3]]
Output:4
Explanation:
Initially, M =[[0,0,0],[0,0,0],[0,0,0]]
After performing [2,2], M =[[1,1,0],[1,1,0],[0,0,0]]
After performing [3,3], M =[[2,2,1],[2,2,1],[1,1,1]]
So the maximum integer in M is 2, and there are four of it in M. So return4.
Note:
The range of m and n is [1,40000].
The range of a is [1,m], and the range of b is [1,n].
The range of operations size won't exceed 10,000.
二、题解
(1) 暴力(超时)
/**
* @thought:暴力破解(超时):
*
* 因为a>0,b>0,故每一个操作都会涉及到M[0][0],故我们完成每个操作后,
* 再次遍历矩阵,看有多少个元素是等于M[0][0]就知道最大元素有多少个了
*/publicintmaxCount(int m,int n,int[][] ops){int[][] M =newint[m][n];int maxCount =0;for(int[] op : ops)for(int i =0; i < op[0]; i++)for(int j =0; j < op[1]; j++)
M[i][j]++;for(int i =0; i < m; i++)for(int j =0; j < n; j++)if(M[i][j]==M[0][0])
maxCount++;return maxCount;}
复杂度分析
时间复杂度: O(x∗m∗n),x 是 ops 数组的行数。
空间复杂度:O(m∗n)
(2) 脑筋急转弯
/**
* @thought:脑筋急转弯:因为a影响矩阵M的每一行的元素,b影响每一列的元素。
* 因此,对于最小的a1和b1,其他ai和bi的操作范围都会覆盖a1,b1,
* 故我们只需找出被操作的最小面积即可(即 a1*b1)
*
* @date: 1/17/2020 3:49 PM
* @Execution info:
* ·执行用时 0 ms 击败了 100% 的java用户
* ·内存消耗 MB 击败了 % 的java用户
* @Asymptotic Time Complexity:O()
*/publicintmaxCount2(int m,int n,int[][] ops){for(int[] op : ops){if(op[0]< m) m=op[0];if(op[1]< n) n=op[1];}return m * n;}