LeetCode303-区域和检索-数组不可变

题目链接

英文链接:https://leetcode.com/problems/range-sum-query-immutable/

中文链接:https://leetcode-cn.com/problems/range-sum-query-immutable/

题目详述

给定一个整数数组 nums,求出数组从索引 ij (ij) 范围内元素的总和,包含 i, j 两点。

示例:

1
2
3
4
5
给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()

sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3

说明:

  1. 你可以假设数组不可变。
  2. 会多次调用 sumRange 方法。

题目详解

动态规划。

  • 因为会调用多次 sumRange 方法,可以先计算前缀和保存起来。两个前缀和之差就是对应的区间和。
  • 可以多申请一个空间,这样在计算涉及索引 0 的区间和时不用特别判断,可以统一计算形式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class LeetCode_00303 {

class NumArray {
private int[] sums;

public NumArray(int[] nums) {
sums = new int[nums.length + 1];
for (int i = 0; i < nums.length; ++i) {
sums[i + 1] = sums[i] + nums[i];
}
}

public int sumRange(int i, int j) {
return sums[j + 1] - sums[i];
}
}
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* int param_1 = obj.sumRange(i,j);
*/
}