1. 程式人生 > >leetcode939.MinimumAreaRectangle

leetcode939.MinimumAreaRectangle

參考:https://leetcode.com/problems/minimum-area-rectangle/discuss/192759/Simple-AF-JAVA-solution-with-explanation-O(n2) 題目:給出一個xy平面,座標面上有若干點,求這些點構成的最小矩形面積,要去矩形長寬分別與xy軸平行。 輸入:一個二維陣列(點集) 輸出:一個整數(最小矩形面積) 別人思路:用set集合把所有點儲存起來,然後遍歷點集,每次取倆點(x1,y1)和(x2,y2)作為矩形的對角線上你的兩個點。 然後判斷另外兩個點(x1,y2)和(x2,y1)是否也在點集中。若在,則這四個點可以構成矩形,可求得面積, 依次類推,求出所有矩形面積後,選擇最小的即可。

public class Medium_939_MinimumAreaRectangle {

    int x ;
    int y ;
    public Medium_939_MinimumAreaRectangle(int x, int  y){
        this.x = x ;
        this.y = y ;
    }

    @Override
    public boolean equals(Object object){
        return ((Medium_939_MinimumAreaRectangle)object).x==this
.x && ((Medium_939_MinimumAreaRectangle)object).y == this.y ; } @Override public int hashCode(){ return Objects.hash(x,y) ; } } class Solution { Set<Medium_939_MinimumAreaRectangle> set = new HashSet<Medium_939_MinimumAreaRectangle>() ; int min = Integer.
MAX_VALUE ; int area = 0 ; public int minAreaRect(int[][] points) { for(int i=0;i<points.length;i++){ set.add(new Medium_939_MinimumAreaRectangle(points[i][0], points[i][1])) ; } for(int i=0;i<points.length;i++){ for(int j=i+1;j<points.length;j++){ int x1 = points[i][0] ; int y1 = points[i][1] ; int x2 = points[j][0] ; int y2 = points[j][1] ; Medium_939_MinimumAreaRectangle node1 = new Medium_939_MinimumAreaRectangle(x1,y2) ; Medium_939_MinimumAreaRectangle node2 = new Medium_939_MinimumAreaRectangle(x2,y1) ; if(set.contains(node1)&&set.contains(node2)){ area = Math.abs((x2-x1)*(y2-y1)) ; if(area!=0 && min > area){ min = area ; } } } } if(min == Integer.MAX_VALUE){ return 0 ; } return min ; } }