给定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的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。