給定平面上 n 對不一樣的點,「迴旋鏢」 是由點表示的元組 (i, j, k) ,其中 i 和 j 之間的距離和 i 和 k 之間的距離相等(須要考慮元組的順序)。java
找到全部迴旋鏢的數量。你能夠假設 n 最大爲 500,全部點的座標在閉區間 [-10000, 10000] 中。ide
示例:優化
輸入:
[[0,0],[1,0],[2,0]]spa
輸出:
2code
解釋:
兩個迴旋鏢爲 [[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 再存儲到哈希表中。get
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; } }