Java经典算法:最小面积矩形

给定x和y轴上的一组点,请确定由这些点形成的矩形的最小面积,其边平行于x和y轴。
分析
在第一印象中,可以通过3种不同的方法解决此问题:
首先,网格上的最大值是一个常量40000。也许我们可以遍历所有握力的可能性。通过计算操作总数,这是不好的。它的时间在列表O(N ^ 4)处。
其次,也许我们可以使用DFS方法搜索每个点,看看是否可以从每个点形成一个矩形。这可能有效,但这可能是一个更简单的解决方案。
第三,通过查看网格,我们可以考虑矩形的要求。我们可以看到,如果有一个矩形,则对角线(x1,y1)和(x2,y2)应该有2个点。还应该有两个对应于两个对角点的其他点:(x1,y2)和(x2,y1)。因此,解决方案自然就会出来。我们遍历两个对角点的所有可能性,然后看看是否存在其他两个点。
因此,我们采用第三个解决方案。我们可以使用哈希图使点搜索保持恒定时间。下面的解决方案的时间复杂度为O(N ^ 2)。
Java解决方案
public int minAreaRect(int[][] points) {
if(pointsnull || points.length0){
return 0;
}

Arrays.sort(points, new Comparator(){
    public int compare(int[] a, int[] b){
        if(a[0]!=b[0]){
            return Integer.compare(a[0], b[0]);
        }else{
            return Integer.compare(a[1], b[1]);
        }
    } 
});

HashMap> xMap = new HashMap<>();
HashMap> yMap = new HashMap<>();

for(int i=0; i setX = xMap.get(x);

    if(setX==null){
        setX = new HashSet();  
        xMap.put(x, setX);
    }

    setX.add(y);

    //y map
    HashSet setY = yMap.get(y);

    if(setY==null){
        setY = new HashSet();  
        yMap.put(y, setY);
    }

    setY.add(x);
}

int result = Integer.MAX_VALUE;

for(int i=0; i0){
                result = Math.min(result, area);
            }
        }
    }
}

if(result == Integer.MAX_VALUE){
    return 0;
}

return result;}

最后,开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。Java经典算法:最小面积矩形_第1张图片

你可能感兴趣的:(Java经典算法:最小面积矩形)