leetcode 223 Retangle Area

題目要求:求兩個長方形的總面積(長方形長和x周平行,寬和y軸平行)

tags:math

思路:求重合邊的長度,然後求得重合面積。總面積爲兩個長方形的面積和減去重合面積。

我的代碼:

情況1:如果長方形有一對邊是分離的,則兩個長方形不相交
情況2:如果長方形有一對邊是包含的,則短邊乘以另一對邊相交長度,則爲重合面積
情況3:兩對邊都是包含一部分,則重合面積爲兩邊相交長度乘機
由上分析可得,3種情況可以合併成爲計算每對邊交合長度來計算其重合面積。

	public int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
		int mutualACEG = 0;
        if(A>E){//E在A左邊
        	if(A>G){//G在A左邊
        		mutualACEG = 0;
            }else if(A<=G&&C>=G){//G在AC中間
            	mutualACEG = G-A;
            }else{//G在C左邊
            	mutualACEG = C-A;
            }
        }else if(A<=E&&C>=E){//E在AC中間
        	if(A<=G&&C>=G){//G在AC中間
        		mutualACEG = G-E;
            }else{//G在C右邊
            	mutualACEG = C-E;
            }
        }else{//E在C右邊
        	mutualACEG = 0;
        }
        
        int mutualBDFH = 0;
        if(B>F){//F在B下邊
        	if(B>H){//H在B下邊
        		mutualBDFH = 0;
            }else if(B<=H&&D>=H){//H在BD中間
            	mutualBDFH = H-B;
            }else{//H在D上邊
            	mutualBDFH = D-B;
            }
        }else if(B<=F&&D>=F){//F在BD中間
        	if(B<=H&&D>=H){//H在BD中間
        		mutualBDFH = H-F;
            }else{//H在D上邊
            	mutualBDFH = D-F;
            }
        }else{//F在D上邊
        	mutualBDFH = 0;
        }
        return (C-A)*(D-B)+(G-E)*(H-F)-mutualACEG*mutualBDFH;
    }


如果只是考慮重合面積

//別人的思路,只需要知道小的點的最大點,和大的點的最小點,即可獲得共同長度
	//由於兩個長方形不分先後,所以可以通過比大小來操作
	public int computeArea2(int A, int B, int C, int D, int E, int F, int G, int H) {
		int left = Math.max(A,C);
		int right = Math.max(Math.min(C, G),left);
		int bottom = Math.max(B, F);
		int top = Math.max(Math.min(D,H), bottom);
        return (C-A)*(D-B)+(G-E)*(H-F)-(right-left)*(top-bottom);
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章