# 303. Range Sum Query - Immutable - LeetCode Best Practices
Visit original link: [303. Range Sum Query - Immutable - LeetCode Best Practices](https://leetcoder.net/en/leetcode/303-range-sum-query-immutable) for a better experience!
LeetCode link: [303. Range Sum Query - Immutable](https://leetcode.com/problems/range-sum-query-immutable), difficulty: **Easy**.
## LeetCode description of "303. Range Sum Query - Immutable"
Given an integer array `nums`, handle multiple queries of the following type:
1. Calculate the sum of the elements of `nums` between indices `left` and `right` inclusive where `left <= right`.
Implement the `NumArray` class:
- `NumArray(int[] nums)` Initializes the object with the integer array `nums`.
- `int sumRange(int left, int right)` Returns the **sum** of the elements of `nums` between indices `left` and `right` **inclusive** (i.e. `nums[left] + nums[left + 1] + ... + nums[right]`).
### [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
### [Constraints]
- `1 <= nums.length <= 10^4`
- `-10^5 <= nums[i] <= 10^5`
- `0 <= left <= right < nums.length`
- At most `10^4` calls will be made to `sumRange`.
## Intuition 1
- Use a new array `prefix_sums` to save the sum of the previous elements.
- The first element of `prefix_sums` is `0` because the prefix sum **does not include the current element**.
- To find the `sum` of the elements from index `left` to `right` (inclusive), just use `prefix_sums[right + 1] - prefix_sums[left]`.
## Complexity
- Time complexity: `O(N)`.
- Space complexity: `O(N)`.
## Java
```java
class NumArray {
private int[] prefixSums;
public NumArray(int[] nums) {
prefixSums = new int[nums.length + 1];
var sum = 0;
for (var i = 0; i < nums.length; i++) {
sum += nums[i];
prefixSums[i + 1] = sum;
}
}
public int sumRange(int left, int right) {
return prefixSums[right + 1] - prefixSums[left];
}
}
```
## Python
```python
class NumArray:
def __init__(self, nums: List[int]):
self.prefix_sums = [0]
sum_ = 0
for num in nums:
sum_ += num
self.prefix_sums.append(sum_)
def sumRange(self, left: int, right: int) -> int:
return self.prefix_sums[right + 1] - self.prefix_sums[left]
```
## C++
```cpp
class NumArray {
private:
vector prefixSums;
public:
NumArray(vector& nums) {
prefixSums.push_back(0);
auto sum = 0;
for (auto num : nums) {
sum += num;
prefixSums.push_back(sum);
}
}
int sumRange(int left, int right) {
return prefixSums[right + 1] - prefixSums[left];
}
};
```
## JavaScript
```javascript
let prefixSums
var NumArray = function (nums) {
prefixSums = [0]
let sum = 0
nums.forEach((num) => {
sum += num
prefixSums.push(sum)
})
};
NumArray.prototype.sumRange = function (left, right) {
return prefixSums[right + 1] - prefixSums[left]
};
```
## C#
```csharp
public class NumArray
{
int[] prefixSums;
public NumArray(int[] nums)
{
prefixSums = new int[nums.Length + 1];
int sum = 0;
for (int i = 0; i < nums.Length; i++)
{
sum += nums[i];
prefixSums[i + 1] = sum;
}
}
public int SumRange(int left, int right)
{
return prefixSums[right + 1] - prefixSums[left];
}
}
```
## Go
```go
type NumArray struct {
prefixSums []int
}
func Constructor(nums []int) NumArray {
prefixSums := make([]int, len(nums) + 1)
sum := 0
for i, num := range nums {
sum += num
prefixSums[i + 1] = sum
}
return NumArray{prefixSums}
}
func (this *NumArray) SumRange(left int, right int) int {
return this.prefixSums[right + 1] - this.prefixSums[left]
}
```
## Ruby
```ruby
class NumArray
def initialize(nums)
@prefix_sums = [0]
sum = 0
nums.each do |num|
sum += num
@prefix_sums << sum
end
end
def sum_range(left, right)
@prefix_sums[right + 1] - @prefix_sums[left]
end
end
```
## Other languages
```java
// Welcome to create a PR to complete the code of this language, thanks!
```
## Intuition 2
Directly returning the sum of the values in the array range can pass the test, but it will fail if the test case is stricter.
So we still need to learn a more efficient solution: `Prefix Sum` solution.
## Complexity
- Time complexity: `O(M * N)`.
- Space complexity: `O(M * N)`.
## Python
```python
class NumArray:
def __init__(self, nums: List[int]):
self.nums = nums
def sumRange(self, left: int, right: int) -> int:
return sum(self.nums[left:right + 1])
```
## Other languages
```java
// Welcome to create a PR to complete the code of this language, thanks!
```
Dear LeetCoders! For a better LeetCode problem-solving experience, please visit website [leetcoder.net](https://leetcoder.net): Dare to claim the best practices of LeetCode solutions! Will save you a lot of time!
Original link: [303. Range Sum Query - Immutable - LeetCode Best Practices](https://leetcoder.net/en/leetcode/303-range-sum-query-immutable).
GitHub repository: [f*ck-leetcode](https://github.com/fuck-leetcode/fuck-leetcode).