447.回旋镖的数量

题目

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

    思路

    暴力的话为O(N^3^)。
    使用哈细表做到O(N^2^)。
    遍历每个点i,以i为锚点,遍历其他所有节点j。计算j与i的距离,将距离加入到哈细表中。
    对于每个i遍历之后,遍历哈希表,哈希表中如果有大于2的值,则为n*(n-1)。
  • 优化**:设现在哈希表项为n,则对应的值为n(n-1)。如果增加了一个,则为(n+1)n,两者相差2n,因此每次添加到哈希表的时候,如果哈希表的值大于1,则直接将当前值加上2*n即可。这样免去了在此遍历一次哈希表的过程。

    代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class Solution {
    public:
    int numberOfBoomerangs(vector<vector<int>>& points) {
    int cnt = 0;
    for(int i=0;i<points.size();++i){
    unordered_map<int,int> m;
    for(int j=0;j<points.size();++j){
    if(i==j) continue;
    int k = pow(points[j][0]-points[i][0],2)+pow(points[j][1]-points[i][1],2);
    if(m.find(k)==m.end()) {
    m[k] = 1;
    }else {
    cnt += 2 * m[k];
    m[k]+=1;
    }
    }
    }
    return cnt;
    }
    };
作者

赵业伟

发布于

2021-09-13

更新于

2021-09-13

许可协议

评论