Estoy tratando de resolver algunos desafíos de codificación de 'hackerrank.com'. Estoy atascado en este:
Se le dará una matriz de enteros arr y un solo entero k . Debe crear una matriz arr' de longitud k a partir de elementos de arr de modo que se minimice su injusticia. La injusticia se define como max(arr') - min(arr') La función debe devolver la minimum possible unfairness
Mi código funciona bien para la mayoría de los casos de prueba. Sin embargo, en tres de esos casos de prueba, aquellos en los que el tamaño de arr y k es particularmente grande, fallan debido a un exceso del límite de tiempo dado.
¿Cómo puedo optimizar el rendimiento de mi código? Gracias por adelantado
function maxMin(k, arr) { // create array to push unfairness values to var unfairnesses = []; // sort given array in ascending order arr.sort(function(a, b) { return a - b; }); // loop over sorted array for(var i = 0; i < arr.length - k + 1; i++) { // get array with the length of k at position i var tempArr = arr.slice(i, i + k); // determine Max and Min of the sliced array var tempArrMax = Math.max(...tempArr); var tempArrMin = Math.min(...tempArr); // get unfairness of the sliced array var thisUnfairness = tempArrMax - tempArrMin; // push sliced-array-unfairness to unfairnesses array unfairnesses.push(thisUnfairness); } // return minimal value of unfairnesses array return Math.min(...unfairnesses); }Los dos primeros pasos podrían ser:
Math.max y Math.min : el primer elemento de un segmento es el más pequeño, el último es el más grande.Math.max y Math.min , puede eliminar la llamada Array.prototype.slice . Luego te queda una ordenación y un solo paso sobre la matriz.Para ordenar la matriz, ya está recorriendo todo el conjunto una vez. Luego estás haciendo un bucle en otro momento para averiguar cuál es el máximo y cuál es el mínimo.
Estás haciendo un bucle dos veces, ya que solo puedes hacer un bucle una vez si lo haces:
function minMax(array) { const safeArray = array ?? [] // No max or min as array is empty if(safeArray.length === 0) return [undefined, undefined] let max: number = Number.MIN_SAFE_INTEGER let min: number = Number.MAX_SAFE_INTEGER for(let item of safeArray) { max = Math.max(item, max) min = Math.min(item, min) } return [max, min] }