使用Java解决leetcode

时间:2016-09-10 12:33:40

标签: java

问题:

找到2D平面中两个直线矩形所覆盖的总面积。

每个矩形由其左下角和右上角定义,如图所示。 pic

代码:

public class Solution {
    public int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
         int sum=(C - A) * (D - B) + (H - F) * (G - E);
         int shadow=Math.max((Math.min(G, C) - Math.max(A, E)), 0) * Math.max((Math.min(D, H) - Math.max(B, F)), 0);
         return sum-shadow;
    }
}

正如您所见,我编写了Java代码来解决这个问题。但我不知道为什么我不能通过一次测试。

Input:
-1500000001
0
-1500000000
1
1500000000
0
1500000001
1


Output:
-1294967294

Expected:
2

我使用python实现相同的方法,它工作正常。我不知道为什么Java版本无法通过这个测试。任何人都可以告诉我为什么?

另一个版本:

public class Solution {
    public int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
        int area1 = (C-A) * (D-B);
        int area2 = (G-E) * (H-F);

        int overlapRegion = overlap(A, B, C, D, E, F, G, H);
        return area1 + area2 - overlapRegion;
    }

    private int overlap(int A, int B, int C, int D, int E, int F, int G, int H) {
        int h1 = Math.max(A, E);
        int h2 = Math.min(C, G);
        int h = h2 - h1;

        int v1 = Math.max(B, F);
        int v2 = Math.min(D, H);
        int v = v2 - v1;

        if(h<=0 || v<=0) return 0;
        else return h*v;
    }
}

1 个答案:

答案 0 :(得分:1)

由于Java没有无符号值,因此总和已经溢出并变为负数。使用long代替int可为您的号码留出更多空间。