Mi reto es el siguiente:
Recibo una matriz no ordenada y necesito saber si al eliminar un elemento (y solo uno) de esa matriz, ¿puedo convertirlo en una secuencia estrictamente creciente?
Nota: la secuencia a0, a1, ..., an se considera estrictamente creciente si a0 < a1 < ... < an. La secuencia que contiene solo un elemento también se considera estrictamente creciente.
Entonces, por ejemplo, [1,3,5,1,7] devuelve verdadero, pero [1,78, 23, 42, 102] devuelve falso.
Pude escribir un código que prueba perfectamente esto, como verás a continuación. El problema es que su tiempo de ejecución es mayor que 4 segundos (mi límite de tiempo de ejecución) si le proporciona una matriz muy grande.
Me quedé sin ideas y no puedo pensar en cómo puedo mejorar esto. Cualquier consejo es apreciado.
Editar: me di cuenta de que lo que probablemente está causando el problema es el operador de propagación que estoy usando para recrear la cadena cada vez que la verifico. Pero no se me ocurre ninguna manera de no usarlo... Tal vez mañana con la cabeza fresca.
const isBigger = (a,b) => b > a; const checksSequence = function (array) { isItaSequence = true; for(let i=0; i !== array.length - 1 && isItaSequence; i++ ){ isItaSequence = isBigger(array[i],array[i+1]); } return isItaSequence } function solution(sequence) { let sequenceRemoving1 = false; for (let i = 0; i !== sequence.length && !sequenceRemoving1 ; i++){ let modifiedArray = [...sequence] modifiedArray.splice(i, 1) sequenceRemoving1 = checksSequence(modifiedArray); } return sequenceRemoving1 } <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="index.js"></script> </head> <body> </body> </html>Tiene muchos bucles anidados, por lo que la complejidad del algoritmo es muy alta. Prueba el siguiente código:
const t = [1, 3, 5, 1, 7]; const t1 = [10, 1, 2, 3, 4, 5]; const t2 = [3, 1, 4, 5, 6, 7]; const f = [1, 78, 23, 42, 102]; const f1 = [1, 1, 2, 3, 4, 4]; const f2 = [1, 1, 1, 2, 3]; console.log(solution(t), solution(t1), solution(t2), solution(f), solution(f1), solution(f2)); function solution(array) { let max = array[0]; let firstOccurrence = false; for (let i = 1; i < array.length; i++) { if (max >= array[i]) { if (firstOccurrence) { return false; } firstOccurrence = true; if (i === 1) { max = array[i]; } } else { max = array[i]; } } return true; }