Leetcode刷题100天—447. 回旋镖的数量( 哈希表)—day37
Posted 神的孩子都在歌唱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题100天—447. 回旋镖的数量( 哈希表)—day37相关的知识,希望对你有一定的参考价值。
前言:
作者:神的孩子在歌唱
大家好,我叫运智
447. 回旋镖的数量
难度中等176收藏分享切换为英文接收动态反馈
给定平面上 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
提示:
n == points.length
1 <= n <= 500
points[i].length == 2
-104 <= xi, yi <= 104
- 所有点都 互不相同
package 哈希表;
import java.util.HashMap;
import java.util.Map;
/*
* https://leetcode-cn.com/problems/number-of-boomerangs/
* 解题思路:
* 1. 一个个点遍历,通过两点之间确定距离公式k^2=(y1-x1)^2+(x1-x2)^2获取距离
* 2. 通过哈希遍历保存每两个点的距离,要是相同就加一
* 3. 在遍历哈希获取每个距离统计的次数n,通过公式n(n-1)获取排列次数
*/
public class _447_回旋镖的数量 {
public int numberOfBoomerangs(int[][] points) {
// 定义一个返回值
int sum=0;
// 遍历每一个点
for(int i=0;i<points.length;i++) {
// 将每两个点的距离存入哈希.相同的距离就加一
// 设置哈希
HashMap<Integer, Integer> map=new HashMap<>();
for(int j=0;j<points.length;j++) {
// 获取距离
int distance=(points[i][0]-points[j][0])*(points[i][0]-points[j][0])
+(points[i][1]-points[j][1])*(points[i][1]-points[j][1]);
// 存入哈希
map.put(distance, map.getOrDefault(distance, 0)+1);
}
System.out.print(map);
// 遍历完后就开始遍历哈希,因为已经知道每个j点跟i点距离的次数了,获取这些j点的排雷顺序就可以了
for(Map.Entry<Integer, Integer> entry:map.entrySet()) {
int value=entry.getValue();
// 如果更i点距离相同的次数大于1就能排序
if (value>1) {
sum+=value*(value-1);
}
}
}
return sum;
}
}
本人csdn博客:https://blog.csdn.net/weixin_46654114
转载说明:跟我说明,务必注明来源,附带本人博客连接。
以上是关于Leetcode刷题100天—447. 回旋镖的数量( 哈希表)—day37的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 447 回旋镖的数量[Map] HERODING的LeetCode之路
LeetCode 678. 有效的括号字符串(贪心,动规) / 4. 寻找两个正序数组的中位数(二分,关键题) / 447. 回旋镖的数量