🌗 223. 矩形面积

吞佛童子2022年10月10日
  • algorithm
  • Number
小于 1 分钟

🌗 223. 矩形面积

难度: 🌗

问题描述

img_32.png


解法

class Solution {
    int max = Integer.MAX_VALUE;
    public int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {
        // 思路:
        // 覆盖区域也是一个矩形,需要确定新矩形的四条边
        // 以横坐标为例,确定横轴 2 个端点
        int area = (ax2 - ax1) * (ay2 - ay1) + (bx2 - bx1) * (by2 - by1);
        int[] x = mySol(ax1, ax2, bx1, bx2);
        if(x[0] == max) {
            return area;
        }
        int[] y = mySol(ay1, ay2, by1, by2);
        if(y[0] == max) {
            return area;
        }
        return area - (x[1] - x[0]) * (y[1] - y[0]);
    }

    private int[] mySol(int m, int n, int p, int q) {
        int[] res = new int[]{max, max};
        // [m, n] & [p, q] 求覆盖区域
        int wm = n - m;
        int wp = q - p;
        if(wm > wp) {
            // 交换点,始终保持 [m, n] 的区域最小
            int tmp = m;
            m = p;
            p = tmp;
            tmp = n;
            n = q;
            q = tmp;
        }
        // System.out.println(m + "  " + n + "  " + p  + "  " + q);
        if(q <= m || p >= n) {
            return res;
        }
        // 存在重合区域
        if(p <= m && q >= n) {
            res[0] = m;
            res[1] = n;
            return res; // [p, q] 完全包裹 [m, n]
        }
        if(p >= m && p <= n) {
            res[0] = p;
            res[1] = n;
            return res;
        }
        if(q >= m && q <= n) {
            res[0] = m;
            res[1] = q;
            return res;
        }
        return res;
    }
}

输出

img_31.png

上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou