给一个整型数组,求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];
}
真的,很震惊原来这样就可以了。。这大概也是数学的奥妙吧。。还有就是个人思维太僵化了,不知道去转化。