代码改变世界

leetcode 223

2016-09-22 10:00  明星bigdata  阅读(179)  评论(0编辑  收藏  举报

题目描述:

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 as shown in the figure.

Rectangle Area

Assume that the total area is never beyond the maximum possible value of int.

第一版代码:

思路就是先找是否有重叠区域,然后用两个矩形面积之和减去重叠区域,由于没有使用math库中的函数,导致代码显得臃肿,而且一开始写的时候各种情况没考虑完全,比如一个矩形完全包围另一个矩形的情况是提交之后发现WA之后才改的:

int computeArea(int A, int B, int C, int D, int E, int F, int G, int H)
{
    int overlap_area = 0;
    if(!(G < A || C < E) && !(H < B || D < F))
    {
        int a = 0, b = 0;
        if(E < A &&  C < G)
            a = C - A;
        else if(A < E && G < C)
            a = G - E;
        else
            a = G-A > C-E ? C-E : G-A;

        if(B < F && H < D)
            b = H - F;
        else if(F < B && D < H)
            b = D - B;
        else
            b = H-B > D-F ? D-F : H-B;
        overlap_area = a * b;
    }
    int area = (C - A ) * (D - B) - overlap_area + (G - E) * (H - F);
    return area;
}

 

第二个版本的代码是看他人的博客的:

int computeArea(int A, int B, int C, int D, int E, int F, int G, int H)
{
    int overlap_area = ( min(C, G) - max(A, E) ) * (min(D, H) - max(B, F));
    if(min(C, G) < max(A, E) || (min(D, H) < max(B, F)))
       overlap_area = 0;
    return (C-A) * (D-B) - overlap_area + (G - E) * (H - F);
}

这里使用了math库中的函数,非常好用,代码看上去非常简洁,虽然比起第一版的代码运行效率降低了一半,但是很简洁,一旦理解了就不容易出错,这才是好代码!