Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined by its bottom left corner and top right corner coordinates.
Analysis
This problem can be converted as a overlap internal problem. On the x-axis, there are (A,C) and (E,G); on the y-axis, there are (F,H) and (B,D). If they do not have overlap, the total area is the sum of 2 rectangle areas. If they have overlap, the total area should minus the overlap area.
Java Solution
public int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) { if(C<E||G<A ) return (G-E)*(H-F) + (C-A)*(D-B); if(D<F || H<B) return (G-E)*(H-F) + (C-A)*(D-B); int right = Math.min(C,G); int left = Math.max(A,E); int top = Math.min(H,D); int bottom = Math.max(F,B); return (G-E)*(H-F) + (C-A)*(D-B) - (right-left)*(top-bottom); } |
With your interval logic, we can perhaps reduce the conditions:
typedef pair INTERVAL;
long intersect(INTERVAL a, INTERVAL b){
return min(a.second, b.second) - max(a.first, b.first);
}
int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
long x = intersect(INTERVAL(A,C), INTERVAL(E, G));
long y = intersect(INTERVAL(B,D), INTERVAL(F,H));
long area = (long)(C - A) * ( D - B) + (long) (G -E) * (H -F);
if (x < 0 || y < 0 ) return area;
else return area - x * y;
}
// The idea being that a negative intersection in either direction, x or y implies that the two rectangles don’t intersect. ‘long’s are used instead of ‘int’s because leetcode says that the output never exceeds INT_MAX, but our computations may.
For more clarity, refer this post: http://yucoding.blogspot.com/2015/10/leetcode-question-rectangle-area.html
Hi,
I have a question. Why you can assume C always bigger than A?
I think no way you can make right-left negative/ top-bottom negative.
Thank you for sharing! Very helpful.
Hi,
There is a mistake in your code. When right-left or top-bottom is negetive, there is no overlap.
Thanks,