leetcode每日一题-回旋镖的数量-「hash」

363 阅读1分钟

leetcode-447-回旋镖的数量

[博客链接]

菜🐔的学习之路

掘金首页

[题目链接]

题目链接

[github地址]

github地址

[题目描述]

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

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

示例 1:

输入:points = [[0,0],[1,0],[2,0]]
输出:2
解释:两个回旋镖为 [[1,0],[0,0],[2,0]][[1,0],[2,0],[0,0]]

示例 2:

输入:points = [[1,1],[2,2],[3,3]]
输出:2

示例 3:

输入:points = [[1,1]]
输出:0

提示:

n == points.length 1 <= n <= 500 points[i].length == 2 -10⁴ <= xi, yi <= 10⁴ 所有点都 互不相同

Related Topics

  • 数组
  • 哈希表
  • 数学
  • 👍 195 👎 0

思路一:hash

  • 这道题单纯空想第一时间很难看出来
  • 不过画个图就很容易得到想要的究竟是什么了
  • 其实就是求其余点到某个点的距离相同的组合方案数量
  • 因为互换之后可以作为不同解,所以当有m个点到i点距离相同的时候可以直接res = res + m*(m-1)
  • 为了简化距离的计算,可以使用距离的平方来代表距离,减少运算
  • 因为数据界限小,所以可以不考虑越界问题
  • 遍历所有点,然后存入hash,key为距离,value为数量即可
public int numberOfBoomerangs(int[][] points) {
    int res = 0, n = points.length;
    for (int i = 0; i < n; i++) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int l = 0; l < n; l++) {
            map.put(cal(points[i], points[l]), map.getOrDefault(cal(points[i], points[l]), 0) + 1);
        }
        for (int x : map.keySet()
        ) {
            res = res + map.get(x) * (map.get(x) - 1);
        }
    }
    return res;

}

public int cal(int[] l, int[] r) {
    int x = (r[0] - l[0]) * (r[0] - l[0]);
    int y = (r[1] - l[1]) * (r[1] - l[1]);
    return x + y;
}
  • 时间复杂度O(n2n^2)
  • 时间复杂度O(nn)