447. Number of Boomerangs
题目描述:Given n points in the plane that are all pairwise distinct, a “boomerang” is a tuple of points
(i, j, k)
such that the distance betweeni
andj
equals the distance betweeni
andk
(the order of the tuple matters).Find the number of boomerangs. You may assume that n will be at most 500 and coordinates of points are all in the range [-10000, 10000] (inclusive).
Example:
Input: [[0,0],[1,0],[2,0]] Output: 2 Explanation: The two boomerangs are [[1,0],[0,0],[2,0]] and [[1,0],[2,0],[0,0]]
题目大意:给定一个二维数组,找出数组中的三元对(i,j,k),使得i和j的距离与i和k的距离相等
思路:若在一组点集{a, b, c, d, …}中,以点a为一个端点,与dis(a, b)相等的点存在n个(包含点b),那么在这n个点中任意选出两个点与点a构成三元组,则有n(n - 1) / 2种情况。但因为三元组[a, b, c]与三元组[a, c, b]并不相同,所以实际为排列问题,答案为n(n - 1)。
代码
package HashTable; import java.util.HashMap; import java.util.Map; /** * @author OovEver * 2018/1/8 23:39 */ public class LeetCode447{ public int numberOfBoomerangs(int[][] points) { if (points == null || points.length == 0 || points[0].length == 0) { return 0; } Map<Integer, Integer> map = new HashMap<>(); int result = 0; for(int i=0;i<points.length;i++) { for(int j=0;j<points.length;j++) { if (i == j) { continue; } int distance = getDistance(points[i], points[j]); map.put(distance, map.getOrDefault(distance, 0) + 1); } for (int value : map.values()) { result += value * (value - 1); } map.clear(); } return result; } private int getDistance(int[] a, int[] b) { return (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]); } }