Leetcode题库-回旋镖的数量(java语言版)
2019-03-26 20:51
344 查看
题目描述:
给定平面上 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]]
本题我想了很久,一直没有思路,这道题设定为简单有点偏颇了,这个题实际上考虑的东西还是挺多的。主要的代码就是计算距离,距离公式d=(x1-x2)^2+(y1-y2)^2.为了方便计算根号去掉了,实际效果一样。
具体思路是:本题是二维数组,二维数组的操作也是一个重点,输入的三点任何一点都可以称为顶点,所以要每一个点都要判断与其他两个点的距离,最后得出一个距离相等的次数。保存到啊map中,键为距离,相等距离的次数。
最后用排列组合的思想来继续最后确定有多少的要求的数组元素,例如4个点与i顶的距离相等,那么随机去两个点A(4,2)=4*3=4*(4-1)
代码如下:
[code] int a[][] = new int[][]{{0,0},{1,0},{2,0}}; int res=0; // 遍历数组,第一个点与其余两个点进行距离比较,第二个点与第一个点第三个点进行比较,第三个点与一二进行比较,挨个计算.求出距离,存到,map中,相等时,次数加一,不相等时,次数为1 for (int i = 0;i<a.length;i++){ Map<Integer,Integer> map = new HashMap <> ( ); //每一个点都有可能称为顶点,所以挨个进行计算距离. for (int j = 0;j<a.length;j++){ // 不考虑当前同样的点 if (i!=j) { // 计算距离((x1-x2)^2+(y1-y2)^2) int distance=(int) Math.pow ( a[i][0] - a[j][0] , 2 ) + (int) Math.pow ( a[i][1] - a[j][1] , 2 ); // 如果距离相同就添加到map中,次数加1 if (map.containsKey ( distance )) { map.put (distance, map.get ( distance )+1 ); }else { // 没有就添加,另次数为1. map.put ( distance,1); } } } System.out.println(map); for (int d:map.keySet ()){ int nums = map.get ( d ); // nums大于2时,证明顶点和两外两个点之间的距离相等,(从相等的距离中随机取两个) if (nums>=2){ // 有nums个点到点i的距离相等(有5个点到这个点距离相等, 那么会是这5个点的中有序取2个点的组合, 也就是一个排列组合) res+=nums*(nums-1);// } } } System.out.println(res);
执行结果:
执行用时:
总结:这道题看似求距离相等的点,其实考虑的问题还是挺多的,每一个点都可以称为顶点,排列组合的问题,二维数组的操作问题等等
2019-3-26
相关文章推荐
- Leetcode题库-存在重复元素2(java语言版)
- Leetcode题库-存在重复元素3(java语言版)
- [LeetCode]447. Number of Boomerangs(求回旋镖数量)
- LeetCode-96. Unique Binary Search Trees (JAVA)BST的数量
- 【PHP解法==LeetCode查找类型问题3(距离计算)】447.回旋镖的数量 && 149.直线上最多的点数(hard)
- [LeetCode] Number of Boomerangs 回旋镖的数量
- leetcode解题之200. Number of Islands Java版(岛屿的数量)
- LeetCode-547. Friend Circles(JAVA)朋友圈数量
- [Leetcode] Gas Station (Java)
- Leetcode java Word Search2
- (Java)LeetCode-28. Implement strStr()
- LeetCode-130. Surrounded Regions (JAVA)(环绕区域)
- [Leetcode][JAVA] Pascal's Triangle I, II
- leetcode_419. Battleships in a Board 在平面上计算船只数量
- java leetcode之逆波兰表达式计算四则运算
- [leetcode]141. Linked List Cycle@Java解题报告
- Climbing Stairs | leetcode 70 【Java解题报告】
- Reverse Integer LeetCode Java
- [Leetcode] Divide Two Integers (Java)
- LeetCode – Two Sum (Java)