題目
給定平面上 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