每日一题_447.回旋镖的数量
生活随笔
收集整理的這篇文章主要介紹了
每日一题_447.回旋镖的数量
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
每日一題_447.回旋鏢的數量
leetcode 447
題目:
題意分析:
今天的題目比較簡單,沒有復雜的算法,主要是用空間換時間。該題是給我們平面上一系列的點,這些點都在整數格點上,然后當其中一個點到另外兩個不重復的點的歐幾里得距離相等,那么這三個點就構成一個回旋鏢,其實就是類似一個 “ V ”行,所以叫 “ 回旋鏢 ” 嘛。而題目就是讓我們求平面上所有的點中,構成的回旋鏢的個數。
算法(哈希表):
首先這道題如果暴力枚舉的話,因為是三個點,所以是三層循環,n最大是500,那么500^3 = 1.25 * 1e8 > 1e8,所以時間復雜度爆了。因此,需要優化。再回去讀題,對于當前的一個點,我們關心的其實是其他點到當前點的距離,然后能和當前點構成回旋鏢的點必然同屬于一個集合,就是距離相等的點構成一個集合,然后不同距離的點就是不同的集合,其次我們并不關心每個集合中的具體的元素,只要知道集合中元素的個數,排列就可以得到能和當前點構成回旋鏢的數量了。鑒于以上分析,我們可以采用Hash表數據結構,遍歷平面上所有點,然后對每一個點,計算其他的點到該點的距離,并用map來記錄每個距離的點的個數。最后A(2, k)排列即可得到結果。
代碼:
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;} };總結
以上是生活随笔為你收集整理的每日一题_447.回旋镖的数量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NLP入门学习3——句法分析(基于LTP
- 下一篇: DDoS deflate 解决服务器被D