Range Sum of Sorted Subarray Sums
MediumArrayTwo PointersBinary SearchSorting
Solution
Solution1: Brute Force
export function rangeSum(nums: number[], n: number, left: number, right: number): number {
const MOD = 1_000_000_007;
const subarraySum: number[] = [];
for (let i = 0; i < n; i++) {
let prefixSum = 0;
for (let j = i; j < n; j++) {
prefixSum += nums[j];
subarraySum.push(prefixSum);
}
}
subarraySum.sort((a, b) => a - b);
return subarraySum.slice(left - 1, right).reduce((acc, num) => acc + (num % MOD), 0);
}
Complexity
- Time:
O(N^2 X logN)
- Space:
O(N^2)
Solution2: Using Heap
(Priority Queue
)
import { Heap } from '@algorithm/lib';
export function rangeSum(nums: number[], n: number, left: number, right: number): number {
const MOD = 1_000_000_007;
const heap = new Heap<[number, number]>((a, b) => (a[0] !== b[0] ? a[0] - b[0] : a[1] - b[1]));
for (let i = 0; i < n; i++) {
heap.push([nums[i], i]);
}
let answer = 0;
for (let mid = 1; mid <= right; mid++) {
const [num, i] = heap.pop()!;
if (left <= mid) {
answer += num;
}
if (i + 1 < n) {
heap.push([num + nums[i + 1], i + 1]);
}
}
return answer % MOD;
}
Complexity
- Time:
O(right X logN)
- Space:
O(N)