《程式設計珠璣》程式碼之路12:如何用C/C++實現array[-1]並利用它寫出優美的程式碼
阿新 • • 發佈:2018-12-14
我們就以最大子陣列和為例:
最大子段和問題:給一組數,計算最大子段和。
在部落格:最大欄位和的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; }