查詢表類演算法//迴旋鏢的數量
阿新 • • 發佈:2018-11-11
給定平面上 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]]
class Solution { private int getDistance(int[] a, int[] b){ int dx = a[0] - b[0]; int dy = a[1] - b[1]; return dx*dx+dy*dy; } public int numberOfBoomerangs(int[][] points) { if(points == null) return 0; int res = 0; for(int i = 0; i < points.length; i++){ Map<Integer,Integer> disCount = new HashMap<>(); for(int j = 0; j < points.length; j++){ if(i == j) continue; int distance = getDistance(points[i], points[j]); int count = disCount.getOrDefault(distance,0); disCount.put(distance,count+1); } for(int count:disCount.values()){ res += count*(count-1); } } return res; } }
getOrDefault(): 當Map集合中有這個key時,就使用這個key值,如果沒有就使用預設值defaultValue
class Solution { public: int numberOfBoomerangs(vector<pair<int, int>>& points) { int res = 0; unordered_map<double,int> Hash; for(pair<int,int>p1:points){ Hash.clear(); for(pair<int,int>p2:points){ if(p1 == p2) continue; Hash[hypot(p1.first-p2.first,p1.second-p2.second)]++; } for(auto val:Hash){ if(val.second>1) res+=val.second*(val.second-1); } } return res; } };
hypot(x,y):return x*x+y*y