1. 程式人生 > >查詢表類演算法//迴旋鏢的數量

查詢表類演算法//迴旋鏢的數量

給定平面上 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