【Leetcode】447回旋镖的数量

2020-07-07 11:48:03 浏览数 (1)

代码语言:javascript复制
package Leetcode真题分门别类.查找表相关问题;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author bennyrhys
 * @Date 2020-05-14 11:35
 * 思路:
 * 暴力O(N^3)不可取,500可以O(n^2)
 * jk到点i的相同距离,map(距离,存在的点个数)。
 * 可选择的个数n!
 *
 * 复杂度:
 * 时间O(N^2)
 * 空间O(N)
 *
 * 注意:
 * 空间越界int long
 * int float引发的问题可以用平方避免
 *
 * 推荐149
 */
public class _447回旋镖的数量 {
    public int numberOfBoomerangs(int[][] points) {
        int ans = 0;
        // i 遍历二维数组第一列
        for (int i = 0; i < points.length; i  ) {
            // map 中存储点 i 到所有其他点的距离出现的频次
            Map<Integer,Integer> map = new HashMap<>();
            // j 遍历二维数组第二列
            for (int j = 0; j < points.length; j  ) {
                if (j != i) {
                    // 计算距离时不进行开根运算, 以保证精度(反正距离相等)
                    int dis = dis(points[i], points[j] );
                    map.put(dis, map.getOrDefault(dis, 0)   1);
                }
            }
            // 排列组合,例如:三个数选两个并且可以改变顺序,也就是A32 = 3 * 2
            for (int dis : map.keySet() ) {
                ans  = (map.get(dis) ) * (map.get(dis) - 1);
            }
        }
        return ans;
    }

    // 计算距离(平方和)
    private int dis(int[] a, int[] b) {
        return (a[0] - b[0]) * (a[0] - b[0])   (a[1] - b[1]) * (a[1] - b[1]);
    }
}

0 人点赞