Range Addition II

Problem

Given an m * n 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 return 4.

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.

Solution

Brute force solution, completely following the instructions of problem (Time Limit Exceeded in Leetcode)

public class Solution {
    public int maxCount(int m, int n, int[][] ops) {
        int[][] matrix = new int[m][n];
        for (int[] op: ops) {
            for (int i = 0; i < op[0]; i++) {
                for (int j = 0; j < op[1]; j++) {
                    matrix[i][j]++;
                }
            }
        }
        int res = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == matrix[0][0]) res++;
            }
        }
        return res;
    }
}

Smart solution thinking about the "cover of range"

public class Solution {
    public int maxCount(int m, int n, int[][] ops) {
        for (int[] op : ops) {
            m = Math.min(m, op[0]);
            n = Math.min(n, op[1]);
        }
        return m * n;
    }
}

Analysis

The problem's description looks complicated but the solution is very easy to understand
In the first solution, we simply follow the instruction of problem in every step
Since we know the first element will be operated every time, we know it is the max value
So we loop the entire matrix and increment the res if we find value equals to matrix[0][0]

The second solution uses the idea of "thinking about the entire problem first"
If we finish all the operation from ops we know that every time a rectangle area of elements are increased
Therefore, to find the count of max value, we need to find out the most cover area of that rectangle
This is to find the min range of the operation from ops
At the end, we get the area of this range and return it as our result
The picture below explains this process much more clearly
Range Addition Image

Complexity:

  • First solution: O(x n m) time and O(m n)* space, where x is the length of operations
  • Second solution: O(x) time and O(1) space (no extra space is used)

results matching ""

    No results matching ""