平面上回旋镖数量求解算法

题目

给定平面上 n 对不同的点,“回旋镖” 是由点表示的元组 (i, j, k) ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序)。
找到所有回旋镖的数量。你可以假设 n 最大为 500,所有点的坐标在闭区间 [-10000, 10000] 中。

示例:

输入:

[[0,0],[1,0],[2,0]]

输出:

2

解释:
两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]

php 实现

class Solution {

    /**
     * @param Integer[][] $points
     * @return Integer
     */
    function numberOfBoomerangs($points) {
        $total = 0;
        if(!$points) {
            return $total;
        }

        $hash = [];
        $total_arr = [];
        foreach($points as $_k1 => $_v1) {
            foreach($points as $_k2 => $_v2) {
                if($_k1 == $_k2) {
                    continue;
                }
                $length = $this->getLength($_v1, $_v2);
                if(!isset($hash[$_k1][$length])) {
                    $hash[$_k1][$length] = 1;
                } else {
                    if(!isset($total_arr[$_k1])) {
                        $total_arr[$_k1] = $hash[$_k1][$length] * 2;
                    } else {
                        $total_arr[$_k1] += $hash[$_k1][$length] * 2;
                    }
                    $hash[$_k1][$length] ++;
                }
            }
        }

        return array_sum($total_arr);
    }

    function getLength($i, $j)
    {
        $x2 = ($i[0] - $j[0]) * ($i[0] - $j[0]);
        $y2 = ($i[1] - $j[1]) * ($i[1] - $j[1]);
        return $x2 + $y2;
    }
}

Golang实现

package main

import (
    "fmt"
)

func main() {
    points := [][]int{
        {0,0},
        {1,0},
        {2,0},
    }
    num := numberOfBoomerangs(points)
    fmt.Println(num)
}

func numberOfBoomerangs(points [][]int) int {
    ans := 0
    hash := map[int]int{}
    for i:= 0;i<len(points);i++{
        for j:=0;j<len(points);j++ {
            if(i == j) {
                continue
            }
            length := getLength(points[i], points[j]);
            if hash[length] > 0 {
                ans += hash[length] * 2
            }
            hash[length] ++
        }
        hash = map[int]int{}
    }
    return ans
}

func getLength(p1 []int, p2 []int) int {
    return ((p1[0] - p2[0]) * (p1[0] - p2[0])) + ((p1[1] - p2[1]) * (p1[1] - p2[1]))
}

关键要理解:

以k1为起点的回旋镖,只要到k1长度相同的点数量($hash[$_k1][$length])增加1个,那k1可以组成的回旋镖数量就是在现有数量$total_arr[$_k1]基础上, 加上$hash[$_k1][$length] * 2
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容