https://leetcode.com/problems/rectangle-area-ii/description/
题目大意:给你每个矩形的左下角和右上角的坐标,问最终图形的面积。
解题思路:这道题的solution写的好。。https://leetcode.com/problems/rectangle-area-ii/solution/
我按照solution2 抄的,解法是n^3的解法不是很优秀,思路是将坐标映射缩小范围,然后暴力标记,之后映射回去计算面积。
class Solution {
public int rectangleArea(int[][] rectangles) {
int n = rectangles.length;
Set<Integer> xSet = new HashSet<>();
Set<Integer> ySet = new HashSet<>();
for (int[] r : rectangles) {
xSet.add(r[0]);
xSet.add(r[2]);
ySet.add(r[1]);
ySet.add(r[3]);
}
Integer[] x = xSet.toArray(new Integer[0]);
Arrays.sort(x);
Integer[] y = ySet.toArray(new Integer[0]);
Arrays.sort(y);
System.out.println(x.length+" "+y.length);
HashMap<Integer, Integer> xMap = new HashMap<>();
HashMap<Integer, Integer> yMap = new HashMap<>();
for (int i = 0; i < x.length; i++)
xMap.put(x[i], i);
for (int i = 0; i < y.length; i++)
yMap.put(y[i], i);
boolean[][] grid = new boolean[x.length][y.length];
for (int[] r:rectangles)
{
for(int i = xMap.get(r[0]);i<xMap.get(r[2]);i++)
{
for(int j=yMap.get(r[1]);j<yMap.get(r[3]);j++)
{
grid[i][j] =true;
}
}
}
/*
for(int i=0;i<grid.length;i++)
{
for(int j=0;j<grid[0].length;j++)
{
if(grid[i][j]) System.out.print(1);
else System.out.print(0);
}
System.out.println();
}*/
long res=0;
for(int i=0;i<grid.length;i++)
{
for(int j=0;j<grid[0].length;j++)
{
if(grid[i][j]) {
res = res + (long) (x[i + 1] - x[i]) * (y[j + 1] - y[j]);
res = res % 1_000_000_007 ;
}
}
}
res = res % 1_000_000_007 ;
return (int)res ;
}
}