From 621a8c08af3f27de699b859afd3904ea4609d1cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E6=A0=91=E6=A3=AE?= <14021051@buaa.edu.cn> Date: Tue, 18 Sep 2018 22:52:16 +0800 Subject: [PATCH] Create 447. Number of Boomerangs.md --- 447. Number of Boomerangs.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 447. Number of Boomerangs.md diff --git a/447. Number of Boomerangs.md b/447. Number of Boomerangs.md new file mode 100644 index 0000000..e56de55 --- /dev/null +++ b/447. Number of Boomerangs.md @@ -0,0 +1,31 @@ +# [447. Number of Boomerangs](https://leetcode.com/problems/number-of-boomerangs/description/) +# 思路 +这道题定义了一种类似回旋镖形状的三元组结构,要求第一个点和第二个点之间的距离跟第一个点和第三个点之间的距离相等。 +现在给了我们n个点,让我们找出回旋镖的个数。那么我们想,如果我们有一个点a,还有两个点b和c,如果ab和ac之间的距离相等,那么就有两种排列方法abc和acb; +如果有三个点b,c,d都分别和a之间的距离相等,那么有六种排列方法,abc, acb, acd, adc, abd, adb,推广一下,如果有n个点和a距离相等,那么排列方式为n(n-1),这属于最简单的排列组合问题了。 +那么我们问题就变成了遍历所有点,让每个点都做一次点a,然后遍历其他所有点,统计和a距离相等的点有多少个,然后分别带入n(n-1)计算结果并累加到res中。 +时间复杂度O(n^2) +# C++ +``` +class Solution { +public: + int numberOfBoomerangs(vector>& points) { + unordered_mapdist_count; + int delta_x, delta_y, dist_2, res = 0; + unordered_map::iterator it; + for(int i = 0; i < points.size(); i++){ + for(int j = 0; j < points.size(); j++){ + delta_x = points[i].first - points[j].first; + delta_y = points[i].second - points[j].second; + dist_2 = delta_x * delta_x + delta_y * delta_y; + dist_count[dist_2]++; + } + for(it = dist_count.begin(); it != dist_count.end(); it++) + res += (it->second * (it -> second - 1)); + dist_count.clear(); + } + + return res; + } +}; +```