【Leetcode】447回旋镖的数量

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]);
    }
}

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑞 新

请小哥喝杯茶~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值