《编程珠玑》代码之路12:如何用C/C++实现array[-1]并利用它写出优美的代码

我们就以最大子数组和为例:

最大子段和问题:给一组数,计算最大子段和。

在博客:最大字段和的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;
}

猜你喜欢

转载自blog.csdn.net/beijixiong5622/article/details/84499672