Цитата:
|
Alexandroppolus,
Максимум можно получить с помощью Math.max(), но чем это поможет - что-то не вдупляю. рони, Проход хоть и один, но для каждого элемента массива выполняется деление - сложная операция, по идее. Хотя я хз как там процессоры внутри работают, может им это и проще чем пару лишних проходов сделать. |
Alexandroppolus,
Цитата:
Цитата:
max = sortedOrder.slice(-1)[0].valueи как это использовать? |
рони,
я про тот "максимум", который можно отсыпать в output[i] вот, изобразил слова в г-коде. Идея в принципе та же, но нет деления на каждой итерации (есть только целочисленное умножение), и дополнительной памяти только массив целых чисел, а не массив объектов. Не знаю, насколько это сможет ускорить, проверять было лень :) function allocate(input, total) { var output = []; var length = input.length; var sortedInput = input.slice().sort(function (a, b) { return a - b; }); var lastValue = 0; var maxH = 0; var remainder = 0; for (var i = 0; total > 0 && i < length; ++i) { var item = sortedInput[i]; var height = item - lastValue; if (height > 0) { lastValue = item; var width = length - i; var area = width * height; if (total < area) { height = Math.floor(total / width); remainder = total % width; } maxH += height; total -= area; } } for (var i = 0; i < length; ++i) { var item = input[i]; output.push(item > maxH ? maxH + (--remainder >= 0 ? 1 : 0) : item); } return output } // проверка для разных total var input = [5,10,0,12, 7, 3]; for (var total = 0; total < 41; total++) { var output = allocate(input, total); console.log(`${total} => ${output}`); } см. консоль |
Alexandroppolus,
:thanks: |
Часовой пояс GMT +3, время: 08:08. |