Range Sum Query
Easy
๐ Problem Statement
Given an integer array nums, handle multiple queries of the following type:
- Calculate the sum of the elements of 
numsbetween indicesleftandrightinclusive whereleft <= right. 
Implement the NumArray class:
NumArray(int[] nums)Initializes the object with the integer arraynums.int sumRange(int left, int right)Returns the sum of the elements ofnumsbetween indicesleftandrightinclusive (i.e.nums[left] + nums[left + 1] + ... + nums[right]).
๐ Example
Example 1
Input
["NumArray", "sumRange", "sumRange", "sumRange"]
[[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]Output
[null, 1, -1, -3]Explanation
NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]); numArray.sumRange(0, 2); // return (-2) + 0 + 3 = 1 numArray.sumRange(2, 5); // return 3 + (-5) + 2 + (-1) = -1 numArray.sumRange(0, 5); // return (-2) + 0 + 3 + (-5) + 2 + (-1) = -3
๐ ๏ธ Solution
โ Brute Force Approach (Inefficient)
For each sumRange(i, j), loop from i to j and sum the elements.
Time Complexity:
Each query: \(O(n)\) in the worst case If there are q queries: \(O(qยทn)\) total
โก Optimized Approach: Prefix Sum
๐ Key Idea:
Precompute a prefix sum array where:
prefix_sum[k] = sum of nums[0] to nums[k - 1]Then:
sumRange(i, j) = prefix_sum[j + 1] - prefix_sum[i]
class NumArray:
    def __init__(self, nums):
        self.prefix_sum = [0]  # prefix_sum[0] = 0
        for num in nums:
            self.prefix_sum.append(self.prefix_sum[-1] + num)
    def sumRange(self, left, right):
        return self.prefix_sum[right + 1] - self.prefix_sum[left]
โฑ๏ธ Time & Space Complexity
| Operation | Time | Space | 
|---|---|---|
| Constructor | \(O(n)\) | \(O(n)\) (prefix array) | 
| sumRange() | \(O(1)\) | โ |