Ответ 1
O(n)
. Используйте стек. Пока числа увеличивают индексы push для стека. Если число равно или меньше или конец массива, введите индексы равных или больших чисел из стека и вычислите. Продолжить.
Код JavaScript:
function f(arr){
let stack = [0];
let best = arr[0];
function collapse(i, val){
console.log('Collapsing... i: ${i}; value: ${val}');
while (stack.length && arr[ stack[stack.length - 1] ] >= val){
let current_index = stack.pop();
let left_index = stack.length ? stack[stack.length - 1] : -1;
console.log('i: ${i}; popped: ${current_index}; value: ${arr[current_index]}; potential: ${i - left_index - 1} * ${arr[current_index]}')
best = Math.max(best, (i - left_index - 1) * arr[current_index]);
}
}
console.log('Starting... stack: ' + JSON.stringify(stack));
for (let i=1; i<arr.length; i++){
if (!stack.length || arr[ stack[stack.length - 1] ] < arr[i]){
stack.push(i);
console.log('Pushing ${i}; stack: ${JSON.stringify(stack)}');
} else {
collapse(i, arr[i]);
stack.push(i);
console.log('Pushing ${i}; stack: ${JSON.stringify(stack)}');
}
}
if (stack.length)
collapse(stack[stack.length - 1] + 1, -Infinity);
return best;
}
//console.log(f([5,5,4]))
//console.log(f([1,2,3,4]))
console.log(f([6,0,6,5,5,2]))