您的位置:首页 > 编程语言 > Java开发

Leetcode题库-回旋镖的数量(java语言版)

2019-03-26 20:51 344 查看

题目描述:

给定平面上 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)

代码如下:

[code]  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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: