1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
class Solution { class Point { int x, y, val; Point (int x, int y, int val) { this.x = x; this.y = y; this.val = val; } } public int rectangleArea(int[][] rectangles) { int M = 1000000007; List<Point> data = new ArrayList<>(); for (int[] r: rectangles) { data.add(new Point(r[0], r[1], 1)); data.add(new Point(r[2], r[3], 1)); data.add(new Point(r[0], r[3], -1)); data.add(new Point(r[2], r[1], -1)); } Collections.sort(data, (a, b) -> (a.x - b.x)); TreeMap<Integer, Integer> map = new TreeMap<>(); int preX = -1, preY = -1, result = 0; for (int i = 0; i < data.size(); i++) { Point p = data.get(i); map.put(p.y, map.getOrDefault(p.y, 0) + p.val); if ( i == data.size() - 1 || data.get(i + 1).x > p.x) { if (preX > -1) { result += ((long) preY * (p.x - preX)) % M; result %= M; } preY = calcY(map); preX = p.x; } } return result; } private int calcY(TreeMap<Integer, Integer> map) { int result = 0, pre = -1, count = 0; for (Map.Entry<Integer, Integer> e: map.entrySet()) { if (pre >= 0 && count > 0) { result += e.getKey() - pre; } count += e.getValue(); pre = e.getKey(); } return result; } }
|
近期评论