每日一题_447.回旋镖的数量
每日一題_447.回旋鏢的數(shù)量
leetcode 447
題目:
題意分析:
今天的題目比較簡(jiǎn)單,沒(méi)有復(fù)雜的算法,主要是用空間換時(shí)間。該題是給我們平面上一系列的點(diǎn),這些點(diǎn)都在整數(shù)格點(diǎn)上,然后當(dāng)其中一個(gè)點(diǎn)到另外兩個(gè)不重復(fù)的點(diǎn)的歐幾里得距離相等,那么這三個(gè)點(diǎn)就構(gòu)成一個(gè)回旋鏢,其實(shí)就是類似一個(gè) “ V ”行,所以叫 “ 回旋鏢 ” 嘛。而題目就是讓我們求平面上所有的點(diǎn)中,構(gòu)成的回旋鏢的個(gè)數(shù)。
算法(哈希表):
首先這道題如果暴力枚舉的話,因?yàn)槭侨齻€(gè)點(diǎn),所以是三層循環(huán),n最大是500,那么500^3 = 1.25 * 1e8 > 1e8,所以時(shí)間復(fù)雜度爆了。因此,需要優(yōu)化。再回去讀題,對(duì)于當(dāng)前的一個(gè)點(diǎn),我們關(guān)心的其實(shí)是其他點(diǎn)到當(dāng)前點(diǎn)的距離,然后能和當(dāng)前點(diǎn)構(gòu)成回旋鏢的點(diǎn)必然同屬于一個(gè)集合,就是距離相等的點(diǎn)構(gòu)成一個(gè)集合,然后不同距離的點(diǎn)就是不同的集合,其次我們并不關(guān)心每個(gè)集合中的具體的元素,只要知道集合中元素的個(gè)數(shù),排列就可以得到能和當(dāng)前點(diǎn)構(gòu)成回旋鏢的數(shù)量了。鑒于以上分析,我們可以采用Hash表數(shù)據(jù)結(jié)構(gòu),遍歷平面上所有點(diǎn),然后對(duì)每一個(gè)點(diǎn),計(jì)算其他的點(diǎn)到該點(diǎn)的距離,并用map來(lái)記錄每個(gè)距離的點(diǎn)的個(gè)數(shù)。最后A(2, k)排列即可得到結(jié)果。
代碼:
class Solution { public:int numberOfBoomerangs(vector<vector<int>>& points) {int ans = 0;for (auto cur_point: points){int x_i = cur_point[0], y_i = cur_point[1];unordered_map<int, int> mp;for (int i = 0; i < points.size(); i ++){int x_j = points[i][0], y_j = points[i][1];int dist = (x_i - x_j) * (x_i - x_j) + (y_i - y_j) * (y_i - y_j);++ mp[dist];}for (auto &item : mp)ans += item.second * (item.second - 1);}return ans;} };總結(jié)
以上是生活随笔為你收集整理的每日一题_447.回旋镖的数量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: NLP入门学习3——句法分析(基于LTP
- 下一篇: DDoS deflate 解决服务器被D