303. Range Sum Query

来源:互联网 发布:淘宝店怎么发布宝贝 编辑:程序博客网 时间:2024/05/17 06:07

1.题目
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.

Example:
Given nums = [-2, 0, 3, -5, 2, -1]

sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3
Note:
You may assume that the array does not change.
There are many calls to sumRange function.

2.分析
  不可变数组范围求和,首先大家都比较容易想到是直接遍历数组,求和,反正时间复杂度也就是O(n),但是这道题好像对时间复杂度要求高,所以下面的note里面它多次提到sumRange 会被多次调用,如果数组长度很长,而你反复去掉用这个函数,效率就会很低,那么怎么提高查询效率呢,我前面做的工作后面为什么还要再重复做呢,能不能把每一步的结果保存下来呢,从源头将数据求和,这样遍历的时候,效率将大大提高。

3.解题
我的解法:

public class NumArray {int[] result;public NumArray(int[] nums) {    result = nums;    // index为i时,记录下当前的0-i的总和    for(int i=1;i<result.length;i++){        result[i] += result[i-1]; // 减少了后续大量的遍历    }}public int sumRange(int i, int j) {    // 边界处理    if(result==null){        return 0;    }         if(i==0){        return result[j];    }    return result[j]-result[i-1];}}

4.总结
  感觉这道题很像动态规划里面的思想,每一步之后,我都记录下这一步结果,然后后续工作将是在这一步结果的基础上进行,而这里面范围求和,是在原本每一个0-i(i在0-length-1之间)已求和的基础上进行范围求和,所以就会大大降低求和工作量。