题目链接
题目:给定在 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]);
}
}