加载中...
447-回旋镖的数量(Number of Boomerangs)
发表于:2021-12-03 | 分类: 中等
字数统计: 696 | 阅读时长: 3分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/number-of-boomerangs

英文原文

You are given n points in the plane that are all distinct, where points[i] = [xi, yi]. A boomerang is a tuple of points (i, j, k) such that the distance between i and j equals the distance between i and k (the order of the tuple matters).

Return the number of boomerangs.

 

Example 1:

Input: points = [[0,0],[1,0],[2,0]]
Output: 2
Explanation: The two boomerangs are [[1,0],[0,0],[2,0]] and [[1,0],[2,0],[0,0]].

Example 2:

Input: points = [[1,1],[2,2],[3,3]]
Output: 2

Example 3:

Input: points = [[1,1]]
Output: 0

 

Constraints:

  • n == points.length
  • 1 <= n <= 500
  • points[i].length == 2
  • -104 <= xi, yi <= 104
  • All the points are unique.

中文题目

给定平面上 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
  • -104 <= xi, yi <= 104
  • 所有点都 互不相同

通过代码

高赞题解

哈希表

数据范围为 $500$,三层循环的朴素做法显然会 TLE。

对于每个回旋镖三元组而言,本质上我们在统计给定 $i$ 的情况下,与 $i$ 距离相等的 $(j, k)$ 组合个数为多少。

我们可以使用哈希表进行预处理,在统计以 $i$ 为三元组第一位的回旋镖个数前,先计算出 $i$ 和其余点的距离,并以 { 距离 : 个数 } 的形式进行存储,然后分别对所有的距离进行累加计数。

在计算距离时为了避免使用 sqrt,我们直接使用 $x^2 + y^2$ 来代指两点间的距离。

代码:

class Solution {
    public int numberOfBoomerangs(int[][] points) {
        int n = points.length;
        int ans = 0;
        for (int i = 0; i < n; i++) {
            Map<Integer, Integer> map = new HashMap<>();
            for (int j = 0; j < n; j++) {
                if (i == j) continue;
                int x = points[i][0] - points[j][0], y = points[i][1] - points[j][1];
                int dist = x * x + y * y;
                map.put(dist, map.getOrDefault(dist, 0) + 1);
            }
            for (int dist : map.keySet()) {
                int cnt = map.get(dist);
                ans += cnt * (cnt - 1);
            }
        }
        return ans;
    }
}
  • 时间复杂度:$O(n^2)$
  • 空间复杂度:$O(n)$

统计信息

通过次数 提交次数 AC比率
49404 74459 66.4%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言

相似题目

题目 难度
直线镜像 中等
上一篇:
446-等差数列划分 II - 子序列(Arithmetic Slices II - Subsequence)
下一篇:
448-找到所有数组中消失的数字(Find All Numbers Disappeared in an Array)
本文目录
本文目录