На вход нам поступает строка со скобочками, расставленными в разном порядке: [], (), {}. Нам нужно определить валидность строк со скобочками: у каждой скобочки должна быть своя по типу закрывающаяся скобочка.
На вход мы получили такую строку: [({})]. Мы не можем просто посчитать количество скобочек и проверить их тип, так как нам важна последовательность. Для более правильного решения данной задачи, нам нужно будет найти сначала одну из пар скобочек (тут это {}) и вырезать её. Дальше нам нужно довырезать все оставшиеся скобочки. Если строка в конце останется пустой, то строка оказалась валидной.
Самый простой способ решения - это использование подхода FILO, когда мы складываем первые непохожие друг на друга скобочки в стек и далее берём самые верхние данные из стека и сопоставляем их с оставшимися символами из строки
Сложность алгоритма линейна O(n), так как перебор элементов идёт через цикл
Medium --------------------------------------------
Лучшее время для продажи и покупки акций
Условие задачи:
К нам на вход поступает массив цен на акции. Нам нужно определить, в какие дни нам нужно покупать акции, а в какие дни продавать акции, чтобы получить максимальную выгоду.
Из примера по графику мы сначала покупаем акции за минимальную цену (1 и 3 доллара) и продаём (5 и 6 долларов).
Сумма должна считаться по конечной прибыли (продажа - покупка): 5-1 и 6-3
если график будет постоянно падать, то возврат должен быть 0
Сложность алгоритма O(n), так как в функции находится всего лишь один цикл
Объединение интервалов
Условие задачи:
Мы должны соединить пересекающиеся интервалы, чтобы на выходе мы имели один интервал.
В функцию попадает массив интервалов [[1,3],[2,6],[8,10],[15,18]], где интервалы [1,3],[2,6] пересекаются (остальные друг друга не касаются). На выходе мы должны получить массив интервалов [[1,6],[8,10],[15,18]], в котором все пересекающиеся интервалы будут объединены.
Сложность алгоритма составляет O(n*logn). Результат:
Hard --------------------------------------------
Сбор дождевой воды
Условие задачи:
На вход подаётся массив с числами, которые отображают наши возвышенности (карта высот). Если высота может быть разная, то ширина блока всегда = 1.
Нужно ответить на вопрос: сколько воды наберётся на данных возвышенностях, если пройдёт дождь
Логика решения:
Нам нужно посчитать, какие будут самые низкие границы справа и слева между колонками, чтобы посчитать количество воды, которое может набраться
Первым делом, стоит определить высоту, которой равняются юниты рельефа, которые удерживают воду
В этом случае нам нужно:
посчитать максимальную высоту блоков слева для каждого отдельного барьера
посчитать максимальную высоту барьеров для каждого блока, но справа
найти минимальное значение из двух высот
посчитать объём через вычитание высоты текущего барьера и минимальной выбранной высоты
Так же можно решить данную задачу используя линейную сложность по памяти O(1)
Тут нам нужно будет воспользоваться алгоритмом два указателя, где нам нужно будет:
поставить два маркера
если левый маркер будет больше правого, то правый маркер передвигаем правый маркер левее