我们就以最大子数组和为例:
最大子段和问题:给一组数,计算最大子段和。
在博客:最大字段和的6种解法,解法三中,我们提到了保存前i项和的操作:
cache[i]代表前i-1项之和,因为在c/c++中,cache[-1]会越界,所以如果用cache[i]代表前i项和的话,那么在用递推公式计算低0项的时候,会特别尴尬。后续计算子段和的时候,下标也是绕来绕去,一不小心就写错。。
那么怎么办呢,这么搞:
int cacheTemp[1000];
int *cache = cacheTemp + 1;
这时候cache[-1]就不会越界了:cahce[i]就可以代表前i项和,而不是前i-1项。
整个计算过程,就会变得特别容易思考:
代码如下:
int elegantCode(){
int ans = 0;
int cacheTemp[1000];
int *cache = cacheTemp + 1;
cache[-1] = 0;
for (int i = 0; i < nums.size(); ++i){
cache[i] = cache[i - 1] + nums[i];
}
for (int i = 0; i < nums.size(); ++i){
int sum = 0;
for (int j = i; j < nums.size(); ++j){
sum = cache[j] - cache[i - 1];
ans = max(ans, sum);
}
}
return ans;
}