I'm trying to solve some 'hackerrank.com' coding challenges. I'm stuck on this one:
You will be given an array of integers arr
and a single integer k
. You must create an array arr'
of length k
from elements of arr
such that its unfairness is minimized.
Unfairness is defined as max(arr') - min(arr')
The function should return the minimum possible unfairness
My code works fine for the majority of test cases. However, in three of those test cases - the ones where the size of arr
and k
is particularly huge - fail due to an excession of the given time limit.
How can I optimize the performance of my code? Thanks in advance
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);
}
CodePudding user response:
The two first steps could be:
- Your array is sorted. Thus there's no need to use
Math.max
andMath.min
- the first element of a slice is the smallest, the last is the largest. - When you eliminate
Math.max
andMath.min
calls, you can removeArray.prototype.slice
call. Then you're left with a sort and a single pass over the array.
CodePudding user response:
Thank you very much. I applied both steps and now I stay within the time limit.