leetcode963. Minimum Area Rectangle II

题目链接
题目:给定在 xy 平面上的一组点,确定由这些点组成的任何矩形的最小面积,其中矩形的边不一定平行于 x 轴和 y 轴。
如果没有任何矩形,就返回 0。
示例1:
在这里插入图片描述
输入:[[1,2],[2,1],[1,0],[0,1]]
输出:2.00000
解释:最小面积的矩形出现在 [1,2],[2,1],[1,0],[0,1] 处,面积为 2。

示例2:
在这里插入图片描述
输入:[[0,1],[2,1],[1,1],[1,0],[2,0]]
输出:1.00000
解释:最小面积的矩形出现在 [1,0],[1,1],[2,1],[2,0] 处,面积为 1。

示例3:
在这里插入图片描述
输入:[[0,3],[1,2],[3,1],[1,3],[2,1]]
输出:0
解释:没法从这些点中组成任何矩形。

参考:https://leetcode.com/problems/minimum-area-rectangle-ii/discuss/208470/Java-O(N3)-bruteforce
思路: 先找到前三个点,再找到第四个点,然后计算面积 很暴力,很直接,但是效果还可以

class Solution {
    public double minAreaFreeRect(int[][] points) {
        Set<String> set = new HashSet<>();
        double result = Double.MAX_VALUE;
        // 构造点集
        for(int[] p : points){
            set.add(p[0] + " " + p[1]);
        }
        //通过第三个点求第四个点
        for(int[] p1 : points){
            for(int[] p2 : points){
                if(p1[0] == p2[0] && p1[1] == p2[1]){
                    continue;
                }
                for(int[] p3 : points){
                    //勾股定理
                    if(dist(p1, p3) + dist(p2, p3) != dist(p1, p2)){
                        continue;
                    }
                    //第四个点的坐标
                    int x = p1[0] + p2[0] - p3[0];
                    int y = p1[1] + p2[1] - p3[1];
                    //第四个点是否在点集中存在
                    if(!set.contains(x + " " + y)){
                        continue;
                    }
                    double area = Math.sqrt(dist(p1, p3)) * Math.sqrt(dist(p2, p3));
                    if(area == 0){
                        continue;
                    }
                    result = Math.min(result, area);
                }
            }
        }
        return result == Double.MAX_VALUE ? 0 : result;
    }
    public double dist(int[] x1, int[] x2){
        return (x1[0] - x2[0]) * (x1[0] - x2[0]) + (x1[1] - x2[1]) * (x1[1] - x2[1]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值