303. Range Sum Query - Immutable

给一个整型数组,求sum(i, j),包括i,j。

不带脑子的办法

这遍历一遍不就行了。噌噌噌

public int sumRange(int i, int j) {
    int result = 0;
    for (int x = i; x <= j; x++) {
        result += nums[x];    // nums是给定的数组
    }
    
    return result;
}

完事,点击提交,欢声笑语打出GG。超时了,最后一个测试用例真的好长。。。

稍微动点脑子

每一次都要求一个和,那么在这个和的基础上进行加减操作来求新的和。

public class NumArray {

    private int[] nums;
    private int lastStart, lastEnd, lastResult;
    private boolean first;
    
    public NumArray(int[] nums) {
        this.nums = nums;
        lastStart = 0;
        lastEnd = 0;
        lastResult = 0;
        first = true;
    }
    
    public int sumRange(int i, int j) {
        if (first) {
            int result = 0;
            for (int x = i; x <= j; x++) {
                result += nums[x];
            }
            lastStart = i;
            lastEnd = j;
            lastResult = result;
            first = false;
            return result;
        }
        int sum = lastResult;
        if (lastStart < i) {
            for (int x = lastStart; x < i; x++) {
                sum -= nums[x];
            }
        } else if (lastStart > i) {
            for (int x = i; x < lastStart; x++) {
                sum += nums[x];
            }
        }
        if (lastEnd < j) {
            for (int x = lastEnd + 1; x <= j; x++) {
                sum += nums[x];
            }
        } else if (lastEnd > j) {
            for (int x = j + 1; x <= lastEnd; x++) {
                sum -= nums[x];
            }
        }
        lastStart = i;
        lastEnd = j;
        lastResult = sum;
        return sum;
    }
}

就定义了一堆变量,还要对第一次进行判断。不过好歹过了。

看完答案后的震惊

虽然说过了,但是想一想这个题有个dp的tag,这也没用到dp啊,而且解法这么丑,肯定有很妙的解法。代码看下面:

int[] nums;

public NumArray(int[] nums) {
    for(int i = 1; i < nums.length; i++)
        nums[i] += nums[i - 1];
        // 此时nums[i]存放的数据为0~i的和
    this.nums = nums;
}

public int sumRange(int i, int j) {
    if(i == 0)
        return nums[j];
    
    return nums[j] - nums[i - 1];
}

真的,很震惊原来这样就可以了。。这大概也是数学的奥妙吧。。还有就是个人思维太僵化了,不知道去转化。

你可能感兴趣的:(303. Range Sum Query - Immutable)