850. Rectangle Area II

Difficulty:
Related Topics:
Similar Questions:

    Problem

    You are given a 2D array of axis-aligned rectangles. Each rectangle[i] = [xi1, yi1, xi2, yi2] denotes the ith rectangle where (xi1, yi1) are the coordinates of the bottom-left corner, and (xi2, yi2) are the coordinates of the top-right corner.

    Calculate the total area covered by all rectangles in the plane. Any area covered by two or more rectangles should only be counted once.

    Return **the *total area***. Since the answer may be too large, return it *modulo* 10^9 + 7.

      Example 1:

    Input: rectangles = [[0,0,2,2],[1,0,2,3],[1,0,3,1]]
    Output: 6
    Explanation: A total area of 6 is covered by all three rectangles, as illustrated in the picture.
    From (1,1) to (2,2), the green and red rectangles overlap.
    From (1,0) to (2,3), all three rectangles overlap.
    

    Example 2:

    Input: rectangles = [[0,0,1000000000,1000000000]]
    Output: 49
    Explanation: The answer is 1018 modulo (10^9 + 7), which is 49.
    

      Constraints:

    Solution

    class Solution {
        public int rectangleArea(int[][] rectangles) {
            List<int[]> memo = new ArrayList<>();
            for (int[] rectangle : rectangles) {
                helper(0, rectangle, memo);
            }
    
            long res = 0;
            final int mod = (int) (1e9 + 7);
            for (int[] m : memo) {
                res = (res + (long) (m[2] - m[0]) * (long) (m[3] - m[1])) % mod;
            }
    
            return (int) res;
        }
    
        private void helper(int id, int[] rectangle, List<int[]> memo) {
            if (id >= memo.size()) {
                memo.add(rectangle);
                return;
            }
    
            int[] cur = memo.get(id);
    
            if (rectangle[2] <= cur[0]
                    || rectangle[0] >= cur[2]
                    || rectangle[1] >= cur[3]
                    || rectangle[3] <= cur[1]) {
                helper(id + 1, rectangle, memo);
                return;
            }
    
            if (rectangle[0] < cur[0]) {
                helper(id + 1, new int[] {rectangle[0], rectangle[1], cur[0], rectangle[3]}, memo);
            }
    
            if (rectangle[2] > cur[2]) {
                helper(id + 1, new int[] {cur[2], rectangle[1], rectangle[2], rectangle[3]}, memo);
            }
    
            if (rectangle[1] < cur[1]) {
                helper(
                        id + 1,
                        new int[] {
                            Math.max(rectangle[0], cur[0]),
                            rectangle[1],
                            Math.min(rectangle[2], cur[2]),
                            cur[1]
                        },
                        memo);
            }
    
            if (rectangle[3] > cur[3]) {
                helper(
                        id + 1,
                        new int[] {
                            Math.max(rectangle[0], cur[0]),
                            cur[3],
                            Math.min(rectangle[2], cur[2]),
                            rectangle[3]
                        },
                        memo);
            }
        }
    }
    

    Explain:

    nope.

    Complexity: