Whenever you see a question that asks for the maximum or minimum of something, consider Dynamic Programming as a possibility
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Solution { public: int maxSubArray(vector<int>& nums) { int maxSofar = nums[0]; int maxCur = 0; for(auto num : nums) { maxCur = max(num, num + maxCur); maxSofar = max(maxCur, maxSofar); } return maxSofar; } };
|
分而知之D&Q
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| class Solution { public: int maxSubArray(vector<int>& nums) { return find(0, nums.size() - 1, nums); } private: int find(int left, int right, vector<int>& nums) { if(left > right) return INT_MIN; int mid = (left + right) / 2; int cur = 0; int maxLeft = 0; int maxRight = 0; for(int i = mid - 1; i >= left ; --i) { cur += nums[i]; maxLeft = max(maxLeft, cur); } cur = 0; for(int i = mid + 1; i <= right; ++i) { cur += nums[i]; maxRight = max(maxRight, cur); } int bestCombined = nums[mid] + maxLeft + maxRight; int leftHalf = find(left, mid - 1, nums); int rightHalf = find(mid + 1, right, nums); return max(bestCombined, max(leftHalf, rightHalf)); } };
|
取中点,往左计算和,往右计算和,这时候有三种情况,中点是最长子串之中的元素,最长子串在中点右边,最长子串在中点左边。对于第一种情况,那就是左+右+中,对于后两种,那么再对左右子串进行同样的查找(DQ)