平面上回旋鏢數(shù)量求解算法

題目

給定平面上 n 對(duì)不同的點(diǎn),“回旋鏢” 是由點(diǎn)表示的元組 (i, j, k) ,其中 i 和 j 之間的距離和 i 和 k 之間的距離相等(需要考慮元組的順序)。
找到所有回旋鏢的數(shù)量。你可以假設(shè) n 最大為 500,所有點(diǎn)的坐標(biāo)在閉區(qū)間 [-10000, 10000] 中。

示例:

輸入:

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

輸出:

2

解釋:
兩個(gè)回旋鏢為 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]

php 實(shí)現(xiàn)

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實(shí)現(xiàn)

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

關(guān)鍵要理解:

以k1為起點(diǎn)的回旋鏢,只要到k1長度相同的點(diǎn)數(shù)量($hash[$_k1][$length])增加1個(gè),那k1可以組成的回旋鏢數(shù)量就是在現(xiàn)有數(shù)量$total_arr[$_k1]基礎(chǔ)上, 加上$hash[$_k1][$length] * 2
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容