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<int[]>(){
    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<Integer, HashSet<Integer>> xMap = new HashMap<>();
HashMap<Integer, HashSet<Integer>> yMap = new HashMap<>();

for(int i=0; i<points.length; i++){
    int x = points[i][0];
    int y = points[i][1];

    //x map
    HashSet<Integer> setX = xMap.get(x);

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

    setX.add(y);

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

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

    setY.add(x);
}

int result = Integer.MAX_VALUE;

for(int i=0; i<points.length-1; 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];

        if(xMap.get(x1).contains(y2) && yMap.get(y1).contains(x2)){
            int area = Math.abs((x1-x2)*(y1-y2));
            if(area>0){
                result = Math.min(result, area);
            }
        }
    }
}

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

return result;}

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值