LeetCode Number of Boomerangs

原题链接在这里:https://leetcode.com/problems/number-of-boomerangs/

题目:

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

题解:

对于每一个点,求其余所有点到这点的距离. 距离相同的都放在一起, 用HashMap<Integer, Integer> hm保存. key是distance, value是相同distance的点的个数.

对于这一点不同的组合方法有value * (value-1)种.

每个点的组合方法都加到res中return.

Time COmplexity: O(n^2), n = points.length. Space: O(n).

AC Java:

 1 public class Solution {
 2     public int numberOfBoomerangs(int[][] points) {
 3         if(points == null || points.length == 0){
 4             return 0;
 5         }
 6         
 7         int res = 0;
 8         HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
 9         for(int i = 0; i<points.length; i++){
10             for(int j = 0; j<points.length; j++){
11                 if(i == j){
12                     continue;
13                 }
14                 
15                 int dist = getDistance(points[i], points[j]);
16                 hm.put(dist, hm.getOrDefault(dist, 0)+1);
17             }
18             
19             for(int val : hm.values()){
20                 res += val * (val-1);
21             }
22             hm.clear();
23         }
24         
25         return res;
26     }
27     
28     private int getDistance(int [] p, int [] q){
29         int dx = p[0] - q[0];
30         int dy = p[1] - q[1];
31         return dx*dx + dy*dy;
32     }
33 }

 

posted @ 2017-01-31 09:27  Dylan_Java_NYC  阅读(312)  评论(0编辑  收藏  举报