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

题目描述:

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

发布了43 篇原创文章 · 获赞 6 · 访问量 6658

猜你喜欢

转载自blog.csdn.net/weixin_37850160/article/details/88829683