lintcode 1237. 回旋镖的数量 map

在平面中给定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]]

思路:回旋镖是相对于三个点来说,所以找出所有点对于一个点的距离,如果有两个或两个以上相等则可以构成回旋镖,此时回旋镖个数等于相等距离个数*(相等距离个数-1),把所有情况相加即为答案

class Solution {
public:
    /**
     * @param points: a 2D array
     * @return: the number of boomerangs
     */
    int getDis(vector<int> &a, vector<int> &b){
        int x = b[0] - a[0];
        int y = b[1] - a[1];
        return x * x + y * y;
    }
    int numberOfBoomerangs(vector<vector<int>> &points) {
        // Write your code here
        int len1=points.size();
        int len2=points[0].size();
        int result=0;
        for (int i = 0; i < len1; i++) {
            /* code */
            map<int,int> temp;
            for(int j=0;j<len1;j++)
            {
                if(i!=j)
                {
                    int dis=getDis(points[i],points[j]);
                    ++temp[dis];
                }
            }
            for (auto a : temp) {
                /* code */
                if(a.second>1)
                {
                    result+=a.second*(a.second-1);
                }
            }
        }
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值