Given n points on a 2D plane, find if there is such a line parallel to y-axis that reflect the given points symmetrically, in other words, answer whether or not if there exists a line that after reflecting all points over the given line the set of the original points is the same that the reflected ones.
Note that there can be repeated points.
Follow up:
Could you do better than O(n^2)?
Example 1:
Input: points = [[1,1],[-1,1]] Output: true Explanation: We can choose the line x = 0.
Example 2:
Input: points = [[1,1],[-1,-1]] Output: false Explanation: We can‘t choose a line.
Constraints:
n == points.length
1 <= n <= 10^4
-10^8 <= points[i][j] <= 10^8
直线镜像。
这道题给的是在一个二维坐标里面给了一堆点的坐标,请问是否存在一条平行于 y 轴的直线,能把这些坐标分成两组,使得所有的坐标都能关于这条直线对称。
这是一道数学题,我这里提供一个 hashset 的做法,需要对 input 数组扫描两次。第一次扫描的时候,我们
- 记录一下横坐标的最大值和最小值
- 将每个坐标都变成字符串存入hashmap
第二次扫描的时候,因为我们已经知道横坐标的最大值 max 和最小值 min 了,所以对称轴的横坐标 = max + min。所以对于 hashset 里的所有横坐标而言,如果能在 hashset 里找的到对应坐标,那么就没问题;一旦找不到对应的坐标,则返回 false。
时间O(n)
空间O(n)
Java实现
1 class Solution { 2 public boolean isReflected(int[][] points) { 3 int max = Integer.MIN_VALUE; 4 int min = Integer.MAX_VALUE; 5 HashSet<String> set = new HashSet<>(); 6 for (int[] p : points) { 7 max = Math.max(max, p[0]); 8 min = Math.min(min, p[0]); 9 String str = p[0] + "a" + p[1]; 10 set.add(str); 11 } 12 13 int sum = max + min; 14 for (int[] p : points) { 15 String str = (sum - p[0]) + "a" + p[1]; 16 if (!set.contains(str)) { 17 return false; 18 } 19 } 20 return true; 21 } 22 }