Skip to content
Advertisement

CodeSignal sumInRange challenge in JavaScript

I’m working on this CodeSignal exercise that says:

You have an array of integers nums and an array queries, where queries[i] is a pair of indices (0-based). Find the sum of the elements in nums from the indices at queries[i][0] to queries[i][1] (inclusive) for each query, then add all of the sums for all the queries together. Return that number modulo 10^9 + 7.

This is my code:

function solution(nums, queries) {
    let accumulator = 0;
    let M = 1000000007;
    for(let i = 0; i < queries.length; i++){
        accumulator += nums.slice(queries[i][0],queries[i][1]+1).reduce((a,b) => a+b);
    }
    return accumulator < 0 ? ((accumulator % M) + M) % M : accumulator%M;
}

It works perfectly, BUT the penultimate hidden test throws a timeout, and I’m out of ideas on how to make this faster.

Thanks in advance for any help you may provide.

PS: if you’re wondering about the difference using modulo at the end, it’s because it seems JS has a bug when using negative numbers.

Advertisement

Answer

As tflave pointed out, using a prefix sum made the code perform faster, and it didn’t timeout. Here’s the code if anyone needs it:

let pre = new Array(1000,0);
 
function preCompute(nums)
{
    let n = nums.length;
    pre[0] = nums[0];
    for (let i = 1; i < n; i++) {
        pre[i] = nums[i] + pre[i - 1];
    }
}
 
function solution(nums, queries)
{
    preCompute(nums);
    let accumulator = 0;
    let M = 1000000007;    
    for(let i = 0; i < queries.length; i++){
        if (queries[i][0] === 0) {
            accumulator += pre[queries[i][1]];
        } else {
            accumulator += pre[queries[i][1]] - pre[queries[i][0] - 1];
        }
    }
    return accumulator < 0 ? ((accumulator % M) + M) % M : accumulator%M;    
}
User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement