Given n points on a 2D plane, find if there is such a line parallel to y-axis that reflect the given set of points.
Example 1:
Given points =
[[1,1],[-1,1]], return true.
Example 2:
Given points =
[[1,1],[-1,-1]], return false.
Follow up:
Could you do better than O(n2)?
Could you do better than O(n2)?
Hint:
- Find the smallest and largest x-value for all points.
- If there is a line then it should be at y = (minX + maxX) / 2.
- For each point, make sure that it has a reflected point in the opposite side.
According to hint, we can find the maximum and minimum x coordinate for all points. The sum of x_min and x_max should be the sum for all reflected points. Now we check for every point, if sum - p[0] exists. If not, return false.
public boolean isReflected(int[][] points) {
Map<integer, <integer, set,>> pointsMap = new HashMap<>();
int minx = Integer.MAX_VALUE, maxx = Integer.MIN_VALUE;
for (int[] p : points) {
if (!pointsMap.containsKey(p[1])) {
pointsMap.put(p[1], new HashSet<>());
}
pointsMap.get(p[1]).add(p[0]);
minx = Math.min(p[0], minx);
maxx = Math.max(p[0], maxx);
}
int sum = minx + maxx;
for (int[] p : points) {
if (!pointsMap.containsKey(p[1])) {
return false;
}
Set<integer> xs = pointsMap.get(p[1]);
if (!xs.contains(sum - p[0])) {
return false;
}
xs.remove(sum - p[0]);
if (xs.size() == 0) {
pointsMap.remove(p[0]);
}
}
return true;
}
No comments:
Post a Comment