標籤:hash ane new i++ find nts cti 可能性 key
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 between i and j equals the distance between i and k (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:2Explanation:The two boomerangs are [[1,0],[0,0],[2,0]] and [[1,0],[2,0],[0,0]]
解析:首先lc上這道題tag是easy,但博主真心覺得這道題並不easy,陷阱很多,需要些空間想象能力以及高中數學知識。題目意思是說給出平面中一些點,求兩點連起來的兩段相等的線段的可能性,其中兩段線段要有一個公用頂點。需要注意的是要考慮順序,比如ba = bc 和 bc = ba算兩種可能性。先來看一個簡單例子,假設有5個點距離a點距離都是2,那麼從這五個點中選出到a的兩條線段的可能性就是C(5,2)(高中數學組合數),再考慮順序不同則要乘以2。所以到a點距離為2的可能性有C(5,2) * 2 = 5! / (2! * 3!) * 2 = 5 * 4種。同理對每一個點做如上計算,加和總數就是最後答案。
//Time: O(n2), Space: O(n) public int numberOfBoomerangs(int[][] points) { if (points == null || points.length == 0 || points[0].length == 0) { return 0; } int result = 0; for (int i = 0; i < points.length; i++) { HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); for (int j = 0; j < points.length; j++) { if (i == j) {//去掉自己和自己的距離的情況 continue; } int x = points[i][0] - points[j][0];//橫座標差 int y = points[i][1] - points[j][1];//縱座標差 int dis = x * x + y * y; if (!map.containsKey(dis)) { map.put(dis, 1); } else { map.put(dis, map.get(dis) + 1); } } for (int v : map.values()) { result = result + v * (v - 1); //C(n, 2) * 2的結果 } } return result; }
447. Number of Boomerangs