image.png

解题思路

Map

447. 回旋镖的数量 - 图2
这里i的索引非常重要 ,可以理解为一个枢纽
对于每一个节点i,建立一个map,存储该节点的距离为dis的点的数目
image.png

  • 对于每一个节点i,扫描一遍所有的其他点,再计算一下其他点到i的距离
  • 建立一个map,key保存到该点 距离的值,value为有多少个距离为key的点
  • 比如到i距离为10的点有一个,则无法找到满足题意的三元组
  • 距离为2的点有两个,说明有满足题意的三元组 ,选择方式有n*(n-1)种
  • 第一次从n个数中选出一个放在j的位置上,第二次从n-1个数中选出一个放在k的位置上,因此为n*(n-1)
  1. public int numberOfBoomerangs(int[][] points) {
  2. int res = 0;
  3. //遍历每一个节点i
  4. for(int i=0;i<points.length;i++){
  5. //map用来保存到i节点距离为key的点的数目value
  6. Map<Integer,Integer> map = new HashMap<>();
  7. //遍历其他的点
  8. for(int j=0;j<points.length;j++){
  9. //如果是其他的点
  10. if(j!=i){
  11. //计算其他的点到i节点的距离
  12. int key = dis(points[i], points[j]);
  13. //点的数目累加
  14. map.put(key,map.getOrDefault(key, 0)+1);
  15. }
  16. }
  17. //遍历map的结果集 如果到i节点的距离为x的距离的点超过2个 则计算其组合数并累加
  18. for(int value:map.values()){
  19. if(value>=2){
  20. res += value*(value-1);
  21. }
  22. }
  23. }
  24. return res;
  25. }
  26. //计算两点之间距离的函数 这里为了避免开根号造成的损失 使用平方和
  27. public int dis(int[] a,int[] b){
  28. return (a[0]-b[0])*(a[0]-b[0])+(a[1]-b[1])*(a[1]-b[1]);
  29. }
  30. //time O(n^2)
  31. //space O(n) 因为每次循环利用的是一个map