https://leetcode-cn.com/problems/number-of-boomerangs/
描述
给定平面上_ 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]]
分析
首先需要数学知识:平面上两点间的距离公式
∣
A
B
∣
=
(
x
1
−
x
2
)
2
+
(
y
1
−
y
2
)
2
|AB|=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}
∣AB∣=(x1−x2)2+(y1−y2)2
排列
P
n
m
=
A
n
m
=
n
(
n
−
1
)
(
n
−
2
)
.
.
.
(
n
−
m
+
1
)
=
n
!
(
n
−
m
)
!
P^m_n = A^m_n = n(n-1)(n-2)...(n-m+1)=\frac{n!}{(n-m)!}
Pnm=Anm=n(n−1)(n−2)...(n−m+1)=(n−m)!n!
首先两次循环,根据距离公式算出距离,将res保存在obj中,存在则+1。接下来遍历obj,当值大于1时,进行排列计算。由于只是两个值排列所以上述排列公式可以简化为
A
n
2
=
n
(
n
−
1
)
A^2_n = n(n-1)
An2=n(n−1)
最后只需要将排列运算的值累加到count即可。
/**
* @param {number[][]} points
* @return {number}
*/
var numberOfBoomerangs = function(points) {
if (points.length < 3) {
return 0
}
let count = 0, len = points.length
for (let i = 0; i < len; i++) {
let obj = {}
for (let j = 0; j < len; j++) {
if (j === i) {
continue
}
let res = (points[j][0] - points[i][0]) ** 2 + (points[j][1] - points[i][1]) ** 2
if (obj[res]) {
obj[res] += 1
} else {
obj[res] = 1
}
}
for (let k in obj) {
if (obj[k] > 1) {
count += obj[k] * (obj[k] - 1)
}
}
}
return count
};