Maximum Number of Visible Points LeetCode solution in Java

1
class Solution {
2
public int visiblePoints(List<List<Integer>> points, int angle, List<Integer> location) {
3
int overlap = 0;
4
List<Double> list = new ArrayList<>(points.size());
5
for (List<Integer> p : points) {
6
if (p.get(0) == location.get(0) && p.get(1) == location.get(1)) {
7
overlap++;
8
} else {
9
list.add(angle(p.get(1) - location.get(1), p.get(0) - location.get(0)));
10
}
11
}
12
Collections.sort(list);
13
int max = 0;
14
int n = list.size();
15
int i2 = 0;
16
// list.get(i1) is first angle leg
17
// list.get(i2) is second angle leg
18
for (int i1 = 0; i1 < n; i1++) {
19
// let's grow i1-i2 angle as much as possible
20
// edge case example: angle = 30, i1 = 350 degrees, i2 = 10 degrees
21
// edge case handling: allow i2 to circle around and calculate second leg as (360 +
22
// list.get(i2 % n))
23
// then i1 = 350, i2 = 370, delta = 20 degrees < 30 degrees
24
while ((i2 < n && list.get(i2) - list.get(i1) <= angle)
25
|| (i2 >= n && 360 + list.get(i2 % n) - list.get(i1) <= angle)) {
26
i2++;
27
}
28
// after i2 went as far as possible away from i1 under allowed limit - check if a new maximum
29
// found
30
max = Math.max(max, i2 - i1);
31
}
32
return max + overlap;
33
}
34

35
private double angle(int dy, int dx) {
36
double a = Math.toDegrees(Math.atan2(dy, dx));
37
return (a < 0 ? a + 360 : a);
38
}
39
}

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0