447. 回旋镖的数量

给定平面上 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]]

PS:

这道题思路其实也比较简单,计算一点和其他点之间的距离,使用哈希表存储,若同一距离出现多次,则可以形成回旋镖。假设同一距离出现 n 次,由数字规律可推出回旋镖的数量 sum = n*(n-1) 。本人开始只能做到存储到哈希表,然后按该公式累加得到最后结果。参考了速度第一的答案,优化如下:假设当前同一距离的数量为 n, 回旋镖数量为 n*(n-1), 当再出现一个同一距离时,回旋镖的数量应为 (n+1)n,与之前相差 (n+1)n - n(n-1) = 2n, 所以只需要把最后答案加上 2*n, 最后 n+1 再存储到哈希表中。

class Solution {

     public int numberOfBoomerangs(int[][] points) {
int len = points.length;
int ans = 0;
HashMap<Double, Integer> map = new HashMap<Double, Integer>();
for(int i = 0; i < len; i++){
for(int j = 0; j < len; j++){
if(i != j){
double dis = Math.pow(points[i][0] - points[j][0], 2)
+ Math.pow(points[i][1] - points[j][1], 2);
if(!map.containsKey(dis)){
map.put(dis, 1);
}else{
int n = map.get(dis);
ans += 2 * n;
map.put(dis, 1+n);
}
}
}
map.clear();
}
return ans;
}
}

最新文章

  1. JDK Collection 源码分析(2)—— List
  2. 记一次 IDEA mybatis.generator 自定义扩展插件
  3. Java json工具类,jackson工具类,ObjectMapper工具类
  4. QTP自传之录制
  5. 关于split splice slice 的一些事
  6. groovy : poi 导出 Excel
  7. 对JVM运行时常量池的一些理解
  8. Spring Boot单元测试(Mock)
  9. 前端开发chrome console的使用 :评估表达式 – Break易站
  10. 深度学习菜鸟的信仰地︱Supervessel超能云服务器、深度学习环境全配置
  11. KVM之一:安装准备(基于CentOS6.7)
  12. 【java】转:Windows系统下面多个jdk版本切换
  13. python3 + flask + sqlalchemy +orm(2):数据库中添加表
  14. java 面向对象基本概念
  15. Redis简介及应用场景
  16. ubuntu16.04 linux 编译安装apache2.4.33
  17. Rainmeter 一部分 语法 中文教程
  18. VC++中如何复制对话框资源
  19. 2018牛客网暑期ACM多校训练营(第一场) J - Different Integers - [莫队算法]
  20. static 和 global

热门文章

  1. 借助DEM生成高精度SketchUp地形,地形分析如此简单
  2. 工作总结1-----String.format的使用
  3. 一、HDFS 原理分析
  4. Element Form表单实践(上)
  5. .NET 合并程序集(将 dll 合并到 exe 中)
  6. SQL拦截器
  7. Storm-Mongodb详解
  8. easyui API
  9. 【JVM】堆区域的一个详细了解并附带调优案例
  10. Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html