303. 区域和检索 - 数组不可变
前言
提示:leetcode做题一定要看清楚题目,如果不懂题目可以去评论区看看大家对题目的理解。
忌讳:不懂题目的意思就答题
题目描述:
提示:
0 <= nums.length <= 104
-105 <= nums[i] <= 105
0 <= i <= j < nums.length
最多调用 104 次 sumRange 方法
一、我的答案
项目中这样写,会被打死,炒了。
面试中这么写,你会直接走人。
sumRange时间复杂度: O(N) ,空间复杂度: O(1)
class NumArray {
private static int[] nums;
public NumArray(int[] nums) {
NumArray.nums = nums;
}
public int sumRange(int i, int j) {
int result = 0;
for (int k = i; k <= j; k++) {
result += nums[k];
}
return result;
}
}
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* int param_1 = obj.sumRange(i,j);
*/
二、看了题解后的答案
项目中这样写,领导会心底夸你;
同事心里会想:这小子还不赖;
面试中这么写,你会就通过啦~ 可能还会加分
sumRange时间复杂度: O(1) ,空间复杂度: O(1)
解题思路如下:
- 在对象初始化的时候将和统计到全局变量sums中
- 用j的和减去i的和就等于我们需要的值了
题解详细思路:
NumArray:
sums 长度为nums.length +1的原因是要统计0 ~ n的和
sums下标为0 ,统计 nums 下标为0的和
sums下标为1 ,统计 nums 下标为0 ~1的和
sums下标为2 ,统计 nums 下标为0 ~ 2的和
sums下标为3 ,统计 nums 下标为0 ~ 3的和
以此类推…
sumRange :
例如i = 1, j = 3
那就是 j(0~3) 的和 减去 i(0~1)的和
例如i = 2, j = 5
那就是 j(0~5) 的和 减去 i(0~2)的和
以此类推…
class NumArray {
int[] sums;
public NumArray(int[] nums) {
int n = nums.length;
sums = new int[n + 1];
for (int i = 0; i < n; 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);
*/