leet-code 303.区域和搜索-数组不可变
给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。
示例:
给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3
说明:
你可以假设数组不可变。 会多次调用 sumRange 方法。
思路: 此题一看,第一反应就是线段树,但是,由于数组不可变,那么用数组解决更为方便快速,开一个数组,将前n个元素的和记录在数组中,数组的长度需要比元素个数多一,用于储存前0个元素的和这个值
,然后用前n个sum相减,就能得到两个sum之间的区间的值
package SegmentTree;
/** * @author BestQiang * leet-code 303.区域和搜索-数组不可变 */
public class NumArray {
private int[] sum; // sum[i]储存前i个元素和, sum[0] = 0 sum[i]储存nums[0...i-1]的和
public NumArray2(int[] nums) {
// 因为有计算前零个nums元素的长度,所以声明sum数组的长度为nums的长度加一
sum = new int[nums.length + 1];
// 要记录sum[0],因为这也是一个区间
sum[0] = 0;
// 对sum数组的值进行遍历赋值
for(int i = 1; i < sum.length; i ++) {
// 就如此时sum[1]对应的元素和是nums[0],因为sum[0]被占了,这个意思懂吧,所以推导到下面的公式
sum[i] = sum[i - 1] + nums[i - 1];
}
}
// 求i到j区间的和,注意是闭区间
public int sumRange(int i, int j) {
return sum[j + 1] - sum[i];
}
}