由53.最大子序和分治法解决方案引出(动态规划方法easy不谈)
class Solution {public:struct State{int lSum;//以l为左端点的最大子段和int rSum;//以r为右端点的最大字段和int mSum;//区间内最大子段和int tSum;//区间和};State pushUp(State l, State r){int lSum = max(l.lSum, l.tSum + r.lSum);int rSum = max(r.rSum, l.rSum + r.tSum);int mSum = max(max(l.mSum, r.mSum), l.rSum + r.lSum);int tSum = l.tSum + r.tSum;return (State) {lSum, rSum, mSum, tSum};}State search(vector<int> &nums, int l, int r){if (l == r) {return (State) {nums[l], nums[l], nums[l], nums[l]};}int m = l + (r - l) / 2;//如果是 l + (r - l) >> 1会报栈溢出,另外三种写法都没有问题State lSub = search(nums, l, m);State rSub = search(nums, m + 1, r);return pushUp(lSub, rSub);}int maxSubArray(vector<int>& nums) {if(nums.empty())return 0;return search(nums, 0, nums.size() - 1).mSum;}};
