难度:
Hard
题意:
思路:
代码:
class Solution {
private int[] setToArray(TreeSet<Integer> set) {
int[] ret = new int[set.size()];
int idx = 0;
for (Integer e: set) {
ret[idx++] = e;
}
return ret;
}
private static int MOD = 1000000007;
public int rectangleArea(int[][] rectangles) {
TreeSet<Integer> set = new TreeSet<Integer>();
for (int i = 0;i < rectangles.length;i++) {
set.add(rectangles[i][0]);
set.add(rectangles[i][2]);
}
int[] x = setToArray(set);
set.clear();
for (int i = 0;i < rectangles.length;i++) {
set.add(rectangles[i][1]);
set.add(rectangles[i][3]);
}
int[] y = setToArray(set);
boolean[][] area = new boolean[x.length][y.length];
for (int i = 0;i < x.length;i++) {
for (int j = 0;j < y.length;j++) {
area[i][j] = false;
}
}
for (int i = 0;i < rectangles.length;i++) {
int lx = Arrays.binarySearch(x, rectangles[i][0]);
int rx = Arrays.binarySearch(x, rectangles[i][2]);
int ly = Arrays.binarySearch(y, rectangles[i][1]);
int ry = Arrays.binarySearch(y, rectangles[i][3]);
for (int j = lx;j < rx;j++) {
for (int k = ly;k < ry;k++) {
area[j][k] = true;
}
}
}
int ret = 0;
for (int i = 0;i < x.length;i++) {
for (int j = 0;j < y.length;j++) {
if (area[i][j]) {
ret += (long)(x[i + 1] - x[i]) * (y[j + 1] - y[j]) % MOD;
if (ret >= MOD) {
ret -= MOD;
}
}
}
}
return ret;
}
}