Description

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]]

my program

思路:创建points.size()*points.size()的数组distance,存放每个点到各个点的距离的平方(距离的话需要开方,产生了浮点数,这里避免了),对数组的每一行元素进行排序,找出每行中某个元素相同的数目n,然后计数count累加(1+2+...+n)的和

class Solution {
public:
int sum(int n) //求1~n的和
{
int res = 0;
while(n)
{
res += n--;
}
return res;
} int numberOfBoomerangs(vector<pair<int, int>>& points) {
int count = 0;
if(points.size() <= 2) return count;
vector<vector<long long> > distance;
//points.size()*points.size()的数组
//存放每个点到各个点的距离的平方(距离的话需要开方,产生了浮点数,这里避免了)
for(int i = 0; i<points.size(); i++) //初始化数组
{
vector<long long>temp(points.size(),0);
distance.push_back(temp);
}
for(int i = 0;i<points.size(); i++) //填充数组(计算距离平方填充)
{
for(int j = 0; j<points.size(); j++)
{
long long x = points[i].first - points[j].first;
long long y = points[i].second - points[j].second;
distance[i][j] = x*x + y*y;
}
} for(int i = 0;i<points.size(); i++)
{
sort(distance[i].begin(),distance[i].end());
int j = 0;
while(j<points.size()-1)
{
int n = 0;
//每行中某个元素相同的数目
while(j<points.size()-1 && distance[i][j] == distance[i][j+1])
{
n++;
j++;
}
if( n != 0) count += sum(n)*2;
j++;
}
}
return count;
}
};

Submission Details

31 / 31 test cases passed.

Status: Accepted

Runtime: 175 ms

Your runtime beats 92.00% of cpp submissions.

other methods

For each point i, map<distance d, count of all points at distance d from i>.

Given that count, choose 2 (with permutation) from it, to form a boomerang with point i.

[use long appropriately for dx, dy and key; though not required for the given test cases]

Time Complexity: O(n^2)

int numberOfBoomerangs(vector<pair<int, int>>& points) {

    int res = 0;

    // iterate over all the points
for (int i = 0; i < points.size(); ++i) { unordered_map<long, int> group(points.size()); // iterate over all points other than points[i]
for (int j = 0; j < points.size(); ++j) { if (j == i) continue; int dy = points[i].second - points[j].second;
int dx = points[i].first - points[j].first; // compute squared euclidean distance from points[i]
int key = dy * dy;
key += dx * dx; // accumulate # of such "j"s that are "key" distance from "i"
++group[key];
} for (auto& p : group) {
if (p.second > 1) {
/*
* for all the groups of points,
* number of ways to select 2 from n =
* nP2 = n!/(n - 2)! = n * (n - 1)
*/
res += p.second * (p.second - 1);
}
}
} return res;
}
int numberOfBoomerangs(vector<pair<int, int>>& points) {
int booms = 0;
for (auto &p : points) {
unordered_map<double, int> ctr(points.size());
for (auto &q : points)
booms += 2 * ctr[hypot(p.first - q.first, p.second - q.second)]++;
}
return booms;
}

Try each point as the “axis” of the boomerang, i.e., the “i” part of the triple. Group its distances to all other points by distance, counting the boomerangs as we go. No need to avoid q == p, as it’ll be alone in the distance == 0 group and thus won’t influence the outcome.

Submitted five times, accepted in 1059, 1022, 1102, 1026 and 1052 ms, average is 1052.2 ms. The initial capacity for ctr isn’t necessary, just helps make it fast. Without it, I got accepted in 1542, 1309, 1302, 1306 and 1338 ms.

LeetCode447. Number of Boomerangs的更多相关文章

  1. Leetcode447.Number of Boomerangs回旋镖的数量

    给定平面上 n 对不同的点,"回旋镖" 是由点表示的元组 (i, j, k) ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序). 找到所有回旋镖的 ...

  2. [Swift]LeetCode447. 回旋镖的数量 | Number of Boomerangs

    Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of po ...

  3. [LeetCode] Number of Boomerangs 回旋镖的数量

    Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of po ...

  4. [LeetCode]447 Number of Boomerangs

    Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of po ...

  5. Leetcode: Number of Boomerangs

    Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of po ...

  6. 34. leetcode 447. Number of Boomerangs

    Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of po ...

  7. 447. Number of Boomerangs

    Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of po ...

  8. [LeetCode&Python] Problem 447. Number of Boomerangs

    Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of po ...

  9. LeetCode——Number of Boomerangs

    LeetCode--Number of Boomerangs Question Given n points in the plane that are all pairwise distinct, ...

随机推荐

  1. IOS之Block的应用-textFeild的回调应用

    Block的一点优点为可以省略回调函数,简化代码今天我就应用了以下. 以下是代码片段. _testTextField1=[[MyTextField alloc] init]; [self.view a ...

  2. linux内核3.6版本及以下的bug引发的故障--cpu使用率100%

    现象:         旗舰店运价库cpu使用率100%,load升高,导致后续的请求失败.         重启服务器,cpu.load恢复正常. 触发条件:        (1)linux内核3. ...

  3. DBA_SEGMENTS - 查看数据库对象所分配的物理存储空间

    SELECT SEGMENT_NAME,SEGMENT_TYPE,<code>TABLESPACE_NAME</code>,EXTENTS,BLOCKS,BYTES/1024/ ...

  4. golang中的那些坑之迭代器中的指针使用

    今天在编写代码的时候,遇到了一个莫名其妙的错误,debug了半天,发现这是一个非常典型且易犯的错误.记之 示例代码: package main import "fmt" type ...

  5. xubuntu openocd nRF51822 download --- 2

    昨天非常晚的时候才最终发现事实上Unkown USB Device并非错误,仅仅是个警告而已,所以我们不关心就能够.让Makefile继续往下走就能够.于是我尝试mbs,s110.cload和firm ...

  6. autoconfig.xml与antx.properties一级application.properties之间的关系

    Java web项目中一般都有配置文件,文件中包含一些配置信息供Java工程启动和运行时使用,这些常见的配置文件大都是一些以.properties后缀的文件,比如常见的antx.properties以 ...

  7. 几个opengl立方体绘制案例

    VC6 下载 http://blog.csdn.net/bcbobo21cn/article/details/44200205 opengl环境配置 http://blog.csdn.net/bcbo ...

  8. UICollectionViews有了简单的重排功能

    代码地址如下:http://www.demodashi.com/demo/13213.html 一.前言 我是UICollectionView的忠实粉丝.这个类比起它的老哥UITableView类具有 ...

  9. ViewStub 的使用

    一.内容概述 举例说明ViewStub标签的使用 二.ViewStub类的文档说明及应用场举例 文档描述: A ViewStub is an invisible, zero-sized View th ...

  10. 自己写浏览器和webserver的分析!

    自己写浏览器和webserver 在android写一个浏览器 editText:输入网址ip:port/login.html.提交 把域名解析成ip 产生请求行 get login.html /r/ ...