Java實現 LeetCode 447 迴旋鏢的數量

447. 迴旋鏢的數量

給定平面上 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;
    }
}
相關文章
相關標籤/搜索