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; }