《程式設計珠璣》程式碼之路12:如何用C/C++實現array[-1]並利用它寫出優美的程式碼

心理學演算法工程師發表於2018-11-25

我們就以最大子陣列和為例:

最大子段和問題:給一組數,計算最大子段和。

在部落格:最大欄位和的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;
}

 

 

 

相關文章