题目描述:
给定平面上 n 对不同的点,“回旋镖” 是由点表示的元组 (i, j, k)
,其中 i
和 j
之间的距离和 i
和 k
之间的距离相等(需要考虑元组的顺序)。
找到所有回旋镖的数量。你可以假设 n 最大为 500,所有点的坐标在闭区间 [-10000, 10000] 中。
示例:
输入: [[0,0],[1,0],[2,0]] 输出: 2 解释: 两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]
本题我想了很久,一直没有思路,这道题设定为简单有点偏颇了,这个题实际上考虑的东西还是挺多的。主要的代码就是计算距离,距离公式d=(x1-x2)^2+(y1-y2)^2.为了方便计算根号去掉了,实际效果一样。
具体思路是:本题是二维数组,二维数组的操作也是一个重点,输入的三点任何一点都可以称为顶点,所以要每一个点都要判断与其他两个点的距离,最后得出一个距离相等的次数。保存到啊map中,键为距离,相等距离的次数。
最后用排列组合的思想来继续最后确定有多少的要求的数组元素,例如4个点与i顶的距离相等,那么随机去两个点A(4,2)=4*3=4*(4-1)
代码如下:
int a[][] = new int[][]{{0,0},{1,0},{2,0}};
int res=0;
// 遍历数组,第一个点与其余两个点进行距离比较,第二个点与第一个点第三个点进行比较,第三个点与一二进行比较,挨个计算.求出距离,存到,map中,相等时,次数加一,不相等时,次数为1
for (int i = 0;i<a.length;i++){
Map<Integer,Integer> map = new HashMap <> ( );
//每一个点都有可能称为顶点,所以挨个进行计算距离.
for (int j = 0;j<a.length;j++){
// 不考虑当前同样的点
if (i!=j) {
// 计算距离((x1-x2)^2+(y1-y2)^2)
int distance=(int) Math.pow ( a[i][0] - a[j][0] , 2 ) + (int) Math.pow ( a[i][1] - a[j][1] , 2 );
// 如果距离相同就添加到map中,次数加1
if (map.containsKey ( distance )) {
map.put (distance, map.get ( distance )+1 );
}else {
// 没有就添加,另次数为1.
map.put ( distance,1);
}
}
}
System.out.println(map);
for (int d:map.keySet ()){
int nums = map.get ( d );
// nums大于2时,证明顶点和两外两个点之间的距离相等,(从相等的距离中随机取两个)
if (nums>=2){
// 有nums个点到点i的距离相等(有5个点到这个点距离相等, 那么会是这5个点的中有序取2个点的组合, 也就是一个排列组合)
res+=nums*(nums-1);//
}
}
}
System.out.println(res);
执行结果:
执行用时:
总结:这道题看似求距离相等的点,其实考虑的问题还是挺多的,每一个点都可以称为顶点,排列组合的问题,二维数组的操作问题等等
2019-3-26