Leetcode PHP题解--D103 447. Number of Boomerangs

D103 447. Number of Boomerangs

题目链接

447. Number of Boomerangs

题目分析

给定一个坐标数组,从中任意取3个坐标(i,j,k),使得从i到j的距离等于i到k的距离。且(i,j,k)(i,k,j)不是同一个组合,需单独计算。

思路

逐个遍历,计算两点距离。并记录在一个数组中。

对于具有相同距离的边的个数,组合数量有以下规律:

当有2条边时,可以组合成2条;
当有3条边时,可以组合成6条;
当有4条边时,可以组合成12条;
当有n条边时,可以组合成n(n-1)条。

对于每一个起点都如此计算,将最后的和返回即可。

最终代码

<?php
class Solution {

    /**
     * @param Integer[][] $points
     * @return Integer
     */
    function numberOfBoomerangs($points) {
        $c = 0;
        $totalPoints = count($points);
        for($i = 0; $i<$totalPoints; $i++){
            $distances = [];
            $iv = $points[$i];
            for($j = 0; $j<$totalPoints; $j++){
                if($i == $j){
                    continue;
                }
                $jv = $points[$j];
                $ij = pow($iv[0]-$jv[0],2) + pow($iv[1]-$jv[1],2);
                if(!isset($distances[$ij])){
                    $distances[$ij] = 0;
                }
                $distances[$ij]++;
            }
            foreach($distances as $v){
                $c += $v*$v-$v;
            }
        }
            
        return $c;
    }
}

若觉得本文章对你有用,欢迎用爱发电资助。

转载于:https://my.oschina.net/u/2246923/blog/3073913

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值