У меня есть проблема, которая имеет довольно ограниченное временное ограничение и хотела бы увидеть, могу ли я подтолкнуть в правильном направлении.
Вот проблема:
Вам представлена стена с колоннами разной высоты. Каждая высота столбца представлена в виде ненулевых целых чисел.
Состояние ввода определяется с помощью массива
H
длиныN
, содержащего высоты каждого столбцовN
на экране, например:
Нарезка моментального снимка на заданной высоте оставляет несколько твердых фигур выше эта высота. Например. срезание на уровне 2 разрезало бы 3 сплошные части:
Нарезка на уровне 1 также разрежет 3 сплошные части:
Аналогично, нарезка на уровне 0 вернет единую (одну) сплошную фигуру, а срезание на уровне 3 не будет вырезать какие-либо фигуры.
Требование:. Учитывая массив высот срезов
S
длиныM
, содержащий все Уровни, на которых должен выполняться "срез", возвращают массив длинойM
, содержащий числа разрезанных кусков для каждого соответствующего разреза.Например, учитывая ввод
H = {2, 1, 3, 2, 3, 1, 1, 2}
иS = { 0, 1, 2, 3 }
, программа должна возвращать величины{1, 3, 3, 0}
, согласно приведенным выше примерам.Оба
N
иM
находятся в диапазоне около20,000
, но высоты в каждом массиве могут достигать1,000,000
.И время и пространство в худшем случае сложность решения не может превышать
O(N + M + max(M) + max(N))
.
Последнее ограничение - это то, что меня озадачивает: это в основном означает, что я не могу иметь вложенные for
-loops, и я не могу избежать этого.
Очевидно, что существует некоторая умная препроцессия, которая должна быть выполнена для получения конечных результатов в O(1)
за один срез, но я не смог его найти.
Я продолжал создавать массив сокращенных номеров для каждого уровня среза, а затем обновлял их все, как итерацию через H
, но это оказывается O(N*M)
, так как мне нужно обновить всю нижнюю высоту уровни.
Существует ли структура данных, подходящая для этой задачи?