给定一个整数数组 nums
,处理以下类型的多个查询:
- 计算索引
left
和right
(包含left
和right
)之间的nums
元素的 和 ,其中left <= right
实现 NumArray
类:
NumArray(int[] nums)
使用数组nums
初始化对象int sumRange(int i, int j)
返回数组nums
中索引left
和right
之间的元素的 总和 ,包含left
和right
两点(也就是nums[left] + nums[left + 1] + ... + nums[right]
)
示例 1:
输入: ["NumArray", "sumRange", "sumRange", "sumRange"] [[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]] 输出: [null, 1, -1, -3] 解释: NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]); numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3) numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1)) numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))
提示:
1 <= nums.length <= 104
-105 <= nums[i] <= 105
0 <= i <= j < nums.length
- 最多调用
104
次sumRange
方法
方法一:前缀和
前缀和计算公式:s[i + 1] = s[i] + nums[i]
。
初始化的时间复杂度是
class NumArray:
def __init__(self, nums: List[int]):
self.s = list(accumulate(nums, initial=0))
def sumRange(self, left: int, right: int) -> int:
return self.s[right + 1] - self.s[left]
# Your NumArray object will be instantiated and called as such:
# obj = NumArray(nums)
# param_1 = obj.sumRange(left,right)
class NumArray {
private int[] s;
public NumArray(int[] nums) {
int n = nums.length;
s = new int[n + 1];
for (int i = 0; i < n; ++i) {
s[i + 1] = s[i] + nums[i];
}
}
public int sumRange(int left, int right) {
return s[right + 1] - s[left];
}
}
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* int param_1 = obj.sumRange(left,right);
*/
class NumArray {
public:
vector<int> s;
NumArray(vector<int>& nums) {
int n = nums.size();
s.resize(n + 1);
for (int i = 0; i < n; ++i) s[i + 1] = s[i] + nums[i];
}
int sumRange(int left, int right) {
return s[right + 1] - s[left];
}
};
/**
* Your NumArray object will be instantiated and called as such:
* NumArray* obj = new NumArray(nums);
* int param_1 = obj->sumRange(left,right);
*/
type NumArray struct {
s []int
}
func Constructor(nums []int) NumArray {
n := len(nums)
s := make([]int, n+1)
for i, v := range nums {
s[i+1] = s[i] + v
}
return NumArray{s}
}
func (this *NumArray) SumRange(left int, right int) int {
return this.s[right+1] - this.s[left]
}
/**
* Your NumArray object will be instantiated and called as such:
* obj := Constructor(nums);
* param_1 := obj.SumRange(left,right);
*/
/**
* @param {number[]} nums
*/
var NumArray = function (nums) {
const n = nums.length;
this.s = new Array(n + 1).fill(0);
for (let i = 0; i < n; ++i) {
this.s[i + 1] = this.s[i] + nums[i];
}
};
/**
* @param {number} left
* @param {number} right
* @return {number}
*/
NumArray.prototype.sumRange = function (left, right) {
return this.s[right + 1] - this.s[left];
};
/**
* Your NumArray object will be instantiated and called as such:
* var obj = new NumArray(nums)
* var param_1 = obj.sumRange(left,right)
*/
class NumArray {
private s: number[];
constructor(nums: number[]) {
const n = nums.length;
this.s = new Array(n + 1).fill(0);
for (let i = 0; i < n; ++i) {
this.s[i + 1] = this.s[i] + nums[i];
}
}
sumRange(left: number, right: number): number {
return this.s[right + 1] - this.s[left];
}
}
/**
* Your NumArray object will be instantiated and called as such:
* var obj = new NumArray(nums)
* var param_1 = obj.sumRange(left,right)
*/
struct NumArray {
nums: Vec<i32>
}
/**
* `&self` means the method takes an immutable reference.
* If you need a mutable reference, change it to `&mut self` instead.
*/
impl NumArray {
fn new(nums: Vec<i32>) -> Self {
Self {
nums
}
}
fn sum_range(&self, left: i32, right: i32) -> i32 {
let (left, right) = (left as usize, right as usize);
self.nums[left..=right].iter().sum::<i32>()
}
}
/**
* Your NumArray object will be instantiated and called as such:
* let obj = NumArray::new(nums);
* let ret_1: i32 = obj.sum_range(left, right);
*/
struct NumArray {
sums: Vec<i32>,
}
/**
* `&self` means the method takes an immutable reference.
* If you need a mutable reference, change it to `&mut self` instead.
*/
impl NumArray {
fn new(mut nums: Vec<i32>) -> Self {
let n = nums.len();
let mut sums = vec![0; n + 1];
for i in 0..n {
sums[i + 1] = sums[i] + nums[i];
}
Self { sums }
}
fn sum_range(&self, left: i32, right: i32) -> i32 {
self.sums[(right + 1) as usize] - self.sums[left as usize]
}
}
/**
* Your NumArray object will be instantiated and called as such:
* let obj = NumArray::new(nums);
* let ret_1: i32 = obj.sum_range(left, right);
*/
typedef struct {
int *sums;
} NumArray;
NumArray *numArrayCreate(int *nums, int numsSize) {
int *sums = malloc(sizeof(int) * (numsSize + 1));
memset(sums, 0, numsSize + 1);
for (int i = 0; i < numsSize; i++) {
sums[i + 1] = sums[i] + nums[i];
}
NumArray *res = malloc(sizeof(NumArray));
res->sums = sums;
return res;
}
int numArraySumRange(NumArray *obj, int left, int right) {
return obj->sums[right + 1] - obj->sums[left];
}
void numArrayFree(NumArray *obj) {
free(obj);
}
/**
* Your NumArray struct will be instantiated and called as such:
* NumArray* obj = numArrayCreate(nums, numsSize);
* int param_1 = numArraySumRange(obj, left, right);
* numArrayFree(obj);
*/