Сложность: hard
У вас есть n супер стиральных машин, расположенных в одну линию. Изначально каждая стиральная машина содержит некоторое количество платьев или пуста.
За один ход вы можете выбрать любые m (1 <= m <= n) стиральные машины и одновременно передать одно платье из каждой выбранной машины в одну из её соседних стиральных машин.
Дан целочисленный массив machines, представляющий количество платьев в каждой стиральной машине слева направо по линии. Верните минимальное количество ходов, необходимых для того, чтобы во всех стиральных машинах стало одинаковое количество платьев. Если это невозможно, верните -1.
Пример:
Input: machines = [1,0,5]
Output: 3
Explanation:
1st move: 1 0 <-- 5 => 1 1 4
2nd move: 1 <-- 1 <-- 4 => 2 1 3
3rd move: 2 1 <-- 3 => 2 2 2
👨💻 Алгоритм:
1⃣Проверьте, можно ли решить задачу: длина массива machines должна быть делителем суммы элементов массива machines. Если нет, верните -1. Вычислите количество платьев, которое должно быть в каждой машине: dresses_per_machine = sum(machines) / len(machines). Нормализуйте задачу, заменив количество платьев в каждой машине на количество платьев, которые нужно удалить из этой машины (может быть отрицательное значение).
2⃣Инициализируйте переменные curr_sum, max_sum и res нулем. Итеративно пройдитесь по всем машинам m в массиве machines, обновляя curr_sum и max_sum на каждом шагу: curr_sum += m, max_sum = max(max_sum, abs(curr_sum)).
3⃣Обновляйте результат res на каждом шагу: res = max(res, max_sum, m). Верните res.
😎 Решение:
var findMinMoves = function(machines) {
const n = machines.length
const dressTotal = machines.reduce((a, b) => a + b, 0)
if (dressTotal % n !== 0) return -1
const dressPerMachine = Math.floor(dressTotal / n)
for (let i = 0; i < n; i++) {
machines[i] -= dressPerMachine
}
let currSum = 0, maxSum = 0, res = 0
for (const m of machines) {
currSum += m
maxSum = Math.max(maxSum, Math.abs(currSum))
res = Math.max(res, Math.max(maxSum, m))
}
return res
}Ставь 👍 и забирай 📚 Базу знаний