Сложность: hard
Дан массив точек, где points[i] = [xi, yi] представляет точку на плоскости XY. Верните максимальное количество точек, которые лежат на одной прямой.
Пример:
Input: points = [[1,1],[2,2],[3,3]]
Output: 3
👨💻 Алгоритм:
1⃣Итерация по всем точкам:
Проходим по всем точкам массива. Пусть текущая точка будет points[i]. Создаём хеш-таблицу cnt для подсчёта углов.
2⃣Расчёт углов и подсчёт:
Для каждой точки j, не равной i, рассчитываем арктангенс вектора points[j] - points[i] и добавляем это значение в хеш-таблицу
3⃣Обновление ответа:
Пусть k будет максимальным количеством вхождений какого-либо значения угла в хеш-таблице. Обновляем ответ значением k + 1 (прибавляем 1, потому что точка points[i] также лежит на этой линии, и её нужно включить в ответ).
😎 Решение:
public class Solution {
public int MaxPoints(int[][] points) {
int n = points.Length;
if (n == 1) {
return 1;
}
int result = 2;
for (int i = 0; i < n; i++) {
Dictionary<double, int> cnt = new Dictionary<double, int>();
for (int j = 0; j < n; j++) {
if (j != i) {
double key = Math.Atan2(points[j][1] - points[i][1],
points[j][0] - points[i][0]);
if (cnt.ContainsKey(key)) {
cnt[key]++;
} else {
cnt[key] = 1;
}
}
}
result = Math.Max(result, cnt.Values.Max() + 1);
}
return result;
}
}Ставь 👍 и забирай 📚 Базу знаний
