hello,大家好,我是星恒
今天给大家带来的每日一题是有关路径距离的题目,其中还涉及到了hash的使用,我们话不多说,直接来看题目:
题目:leetcode 447
给定平面上_ n _对 互不相同 的点 points ,其中 points[i] = [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的距离和 i 和 k 之间的欧式距离相等(需要考虑元组的顺序)。
返回平面上所有回旋镖的数量。
示例:
示例 1:
输入:points = [[0,0],[1,0],[2,0]]
输出:2
解释:两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]
示例 2:
输入:points = [[1,1],[2,2],[3,3]]
输出:2
示例 3:
输入:points = [[1,1]]
输出:0
提示:
分析:
我们先来说这道题目的思路:
这道题目的意思是,让我们在给的points点中寻找3个点,这三个点可以构成回旋镖型,也就是v字型,某一点距离其他两个点的距离相等
我们可以枚举中间点,然后找到与这个点相等距离的点,最后我们可以找到一些和这个点距离相同的点,然后由于考虑元组顺序(就是i,j,k和k,j,i不同),我们将这些距离相等的点排列组合,假设有m个点和这个点距离相等,他的排列组合种类有:
Am2 = m(m - 1)
所以我们只要得到有多少个点和这个点距离相等,当然,由于相等距离也有好几种情况,所以我们使用hash将距离的情况存储起来,只要遇到和这种情况相同的,就将他的相等点 + 1
我们来看代码
题解:
class Solution {
public int numberOfBoomerangs(int[][] points) {
int ans = 0;
for (int[] p : points) {
Map<Integer, Integer> cnt = new HashMap<Integer, Integer>();
for (int[] q : points) {
int dis = (p[0] - q[0]) * (p[0] - q[0]) + (p[1] - q[1]) * (p[1] - q[1]);
cnt.put(dis, cnt.getOrDefault(dis, 0) + 1);
}
for (Map.Entry<Integer, Integer> entry : cnt.entrySet()) {
int m = entry.getValue();
ans += m * (m - 1);
}
}
return ans;
}
}
注意:
如果大家有什么思考和问题,可以在评论区讨论,也可以私信我,很乐意为大家效劳。
好啦,今天的每日一题到这里就结束了,如果大家觉得有用,可以可以给我一个小小的赞呢,我们下期再见!