447. 回旋镖的数量
生活随笔
收集整理的這篇文章主要介紹了
447. 回旋镖的数量
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
447. 回旋鏢的數(shù)量
給定平面上 n 對(duì) 互不相同 的點(diǎn) points ,其中 points[i] = [xi, yi] ?;匦S 是由點(diǎn) (i, j, k) 表示的元組 ,其中 i 和 j 之間的距離和 i 和 k 之間的距離相等(需要考慮元組的順序)。
返回平面上所有回旋鏢的數(shù)量。
示例 1:輸入:points = [[0,0],[1,0],[2,0]] 輸出:2 解釋:兩個(gè)回旋鏢為 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]] 示例 2:輸入:points = [[1,1],[2,2],[3,3]] 輸出:2 示例 3:輸入:points = [[1,1]] 輸出:0解題思路
枚舉+哈希表
對(duì)于每個(gè)點(diǎn),我們計(jì)算出它與其他點(diǎn)的距離。對(duì)于到該點(diǎn)距離相同的點(diǎn),我們加入到該距離對(duì)應(yīng)的list中,該list中的任意兩個(gè)點(diǎn)都可以與該點(diǎn)形成回旋鏢,通過(guò)排列組合,我們可以計(jì)算出可以形成的回旋鏢的個(gè)數(shù)
代碼
class Solution {public int numberOfBoomerangs(int[][] points) {int n=points.length;Map<Integer,List<Integer>>[] map=new HashMap[n];for(int i=0;i<n;i++)map[i]=new HashMap<>();for(int i=0;i<n;i++)for(int j=i+1;j<n;j++){int x1=points[i][0],y1=points[i][1],x2=points[j][0],y2=points[j][1];int d=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);if(!map[i].containsKey(d))map[i].put(d,new ArrayList<>());if(!map[j].containsKey(d))map[j].put(d,new ArrayList<>());map[i].get(d).add(j);map[j].get(d).add(i);}int res=0;for(int i=0;i<n;i++){for(List l:map[i].values()){if(l.size()>=2)res+=l.size()*(l.size()-1);}}return res;} }總結(jié)
以上是生活随笔為你收集整理的447. 回旋镖的数量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 女人做梦梦到大蟒蛇是什么意思
- 下一篇: 524. 通过删除字母匹配到字典里最长单