用Java求解leetcode中的矩形区域

用Java求解leetcode中的矩形区域,java,Java,问题: 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((Ma

问题:

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;
    }
}
求二维平面中两个直线矩形所覆盖的总面积

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

代码:

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;
    }
}
公共类解决方案{
公共整数计算区域(整数A、整数B、整数C、整数D、整数E、整数F、整数G、整数H){
国际区域1=(C-A)*(D-B);
国际区域2=(G-E)*(H-F);
int OverlapseRegion=重叠(A、B、C、D、E、F、G、H);
返回区域1+区域2-重叠区域;
}
私有整数重叠(整数A、整数B、整数C、整数D、整数E、整数F、整数G、整数H){
int h1=数学最大值(A,E);
int h2=数学最小值(C,G);
int h=h2-h1;
int v1=数学最大值(B,F);
int v2=数学最小值(D,H);
int v=v2-v1;

如果(h由于Java没有无符号值,因此总和溢出并变成负数。请使用
long
而不是
int
为您的数字留出更多空间。

非常感谢。我在Java中看到了此代码的另一个版本,但它运行良好,并且没有使用
long
。为什么?我添加了此代码作为对我问题的补充。p可以恢复,因为它以不同的顺序或不同的方式执行操作,从而不会发生溢出。请通过调试器运行它们以查看发生了什么。我相信另一个版本中的这一行会起作用:
if(h@OleV.V.你说得对,这不是一个溢出问题。我没有注意到他不考虑负值。你能写一个答案吗?这样我就可以删除这个。这是一个溢出问题。好吧。你做的是1500000000—1500000000,正确的差值是-3000000000,但是由于溢出(下溢)。,结果是1294967296。OP声称的另一个版本做了正确的事情,也返回了-1294967294,所以它有相同的问题。是我错了。