Number of Boomerangs及pair数据的使用

Given n points in the plane that are all pairwise distinct, a “boomerang” is a tuple of points (i, j, k) such that the distance between i and j equals the distance between i and k (the order of the tuple matters).

Find the number of boomerangs. You may assume that n will be at most 500 and coordinates of points are all in the range [-10000, 10000] (inclusive).

Example:

Input:
[[0,0],[1,0],[2,0]]

Output:
2

Explanation:
The two boomerangs are [[1,0],[0,0],[2,0]] and [[1,0],[2,0],[0,0]]

这道题的思路很简单,就是建立两层循环,从下标0到size,遍历第一层时,设置一个map,记录其他pair距离该pair的距离,如果距离该点相同距离的点数num >= 2,那么就是用数学中的组合数:先从num中取出一个数,然后从num - 1中再取一个数,那么以该点boomerang第一个元素的boomerangs有num*(num - 1)个。接着,再一次遍历其他pair。

代码:

class Solution {
public:
    int numberOfBoomerangs(vector<pair<int, int>>& points) {
        int size = points.size();
        int result = 0;
        if(size < 3)
          return 0;
        for(int i = 0; i < size; i ++){
            map<int, int> myMap;
            for(int j = 0; j < size; j ++){
                if(i != j){
                    myMap[dist(points[i], points[j])] ++;
                }
            }
            for(auto it = myMap.begin(); it != myMap.end(); it ++){
                if((it -> second) >= 2)
                  result += (it -> second) * ((it -> second) - 1);
            }
        }
        return result;
    }

    int dist(pair<int, int> &a,pair<int, int> &b){

        int x=(a.first-b.first)*(a.first-b.first);
        int y=(a.second-b.second)*(a.second-b.second);
        return x+y;
    }
};

其实,把这道题写出来,主要目的是让自己记住两个东西:
1. 定义map时,如果map的value类型为int,那么该map的value缺省值默认为0,解释为int为非类类型,例如:

map<char, int> map1;
cout << map['a'];//输出0
  1. 题目中[0,0]这种组合怎么表示,使用vector<pair<int, int>> points
取出其中的每个元素的第一个值和第二个值的方式:
points[1].first, points[1].second

好了,要说的就这么多!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值