Сложность: hard
Модуль Range - это модуль, который отслеживает диапазоны чисел. Создайте структуру данных для отслеживания диапазонов, представленных в виде полуоткрытых интервалов, и запросов к ним. Полуоткрытый интервал [left, right) обозначает все вещественные числа x, где left <= x < right. Реализуйте класс RangeModule: RangeModule() Инициализирует объект структуры данных. void addRange(int left, int right) Добавляет полуоткрытый интервал [left, right), отслеживая каждое вещественное число в этом интервале. Добавление интервала, который частично перекрывает отслеживаемые в данный момент числа, должно добавить все числа в интервале [left, right), которые еще не отслеживаются. boolean queryRange(int left, int right) Возвращает true, если каждое действительное число в интервале [left, right) отслеживается в данный момент, и false в противном случае. void removeRange(int left, int right) Прекращает отслеживание каждого действительного числа, отслеживаемого в данный момент в полуоткрытом интервале [left, right).
Пример:
Input
["RangeModule", "addRange", "removeRange", "queryRange", "queryRange", "queryRange"]
[[], [10, 20], [14, 16], [10, 14], [13, 15], [16, 17]]
Output
[null, null, null, true, false, true]
👨💻 Алгоритм:
1⃣Инициализируйте класс RangeModule с пустым списком диапазонов.
2⃣Для метода addRange(left, right) добавьте новый диапазон, объединяя его с существующими перекрывающимися диапазонами. Для метода queryRange(left, right) проверьте, полностью ли данный диапазон содержится в отслеживаемых диапазонах.
3⃣Для метода removeRange(left, right) удалите указанный диапазон, разбивая существующие диапазоны на соответствующие части.
😎 Решение:
import java.util.ArrayList;
import java.util.List;
public class RangeModule {
private List<int[]> ranges;
public RangeModule() {
ranges = new ArrayList<>();
}
public void addRange(int left, int right) {
List<int[]> newRanges = new ArrayList<>();
int i = 0;
while (i < ranges.size() && ranges.get(i)[1] < left) {
newRanges.add(ranges.get(i));
i++;
}
while (i < ranges.size() && ranges.get(i)[0] <= right) {
left = Math.min(left, ranges.get(i)[0]);
right = Math.max(right, ranges.get(i)[1]);
i++;
}
newRanges.add(new int[] {left, right});
while (i < ranges.size()) {
newRanges.add(ranges.get(i));
i++;
}
ranges = newRanges;
}
public boolean queryRange(int left, int right) {
for (int[] range : ranges) {
if (range[0] <= left && right <= range[1]) {
return true;
}
}
return false;
}
public void removeRange(int left, int right) {
List<int[]> newRanges = new ArrayList<>();
for (int[] range : ranges) {
if (range[0] < left) {
newRanges.add(new int[] {range[0], Math.min(range[1], left)});
}
if (right < range[1]) {
newRanges.add(new int[] {Math.max(range[0], right), range[1]});
}
}
ranges = newRanges;
}
}
Ставь 👍 и забирай 📚 Базу знаний