【力扣leetcode】回旋镖的数量

76 阅读1分钟

题目

给定平面上 **n **对 互不相同 的点 points ,其中 points[i] = [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的距离和 i 和 k 之间的欧式距离相等(需要考虑元组的顺序)。

返回平面上所有回旋镖的数量。

解题思路

二维数组,i,j,k 从j到i的距离等于从k到i的距离, distanceJI = distanceKI,循环数组,算出其他点到数组项的距离,所以要循环2次数组,计算出距离为d的次数,我用的是Map来保存,temp.set(dis, (temp.get(dis) || 0) + 1),假设距离为d的有m个,回旋镖点的排列是考虑顺序的,从m个点选出2个点,考虑排列顺序,算出总个数,根据排列组合,Am2​=m⋅(m−1)

// 算出2点之间的距离, 为避免浮点数计算,不开平方根
var distanceFun = function ([x1, y1], [x2, y2]) {
  return Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2);
};
var numberOfBoomerangs = function (points) {
  let res = 0;
  const n = points.length;
  // 遍历数组,
  for (let i = 0; i < n; i++) {
    let temp = new Map();
    const t = points[i];
    //再次遍历,算出 2点之间的距离
    for (let j = 0; j < n; j++) {
      const s = points[j];
      const dis = distanceFun(t, s);

      temp.set(dis, (temp.get(dis) || 0) + 1);
    }

    // 算出 总个数
    for (let item of temp.values()) {
    //   if (item >= 2) {
        res += item * (item - 1);
    //   }
    }
  }

  return res;
};
numberOfBoomerangs([
  [0, 0],
  [1, 0],
  [-1, 0],
  [0, 1],
  [0, -1],
]);