dp
class Solution {public:int maxSubArray(vector<int>& nums) {int maxsum = nums[0];for(int i = 1; i < nums.size(); i++){nums[i] = max(nums[i - 1] + nums[i], nums[i]);maxsum = max(maxsum, nums[i]);}return maxsum;}};
归并的方式
class Solution {vector<int> nums;int dac(int left, int right){if(left == right)return nums[left];int mid = (left + right)>>1;int leftval = dac(left, mid);int righval = dac(mid + 1, right);int crossleft = -1000000, crossright = -1000000;int cur = 0;for(int i = mid; i >= left; i--){cur += nums[i];crossleft = max(crossleft, cur);}cur = 0;for(int i = mid + 1; i <= right; i++){cur += nums[i];crossright = max(crossright, cur);}int crossmax = crossleft + crossright;return max(max(leftval, righval), crossmax);}public:int maxSubArray(vector<int>& _nums) {nums = _nums;return dac(0, nums.size() - 1);}};
第二次写题
class Solution {public:int maxSubArray(vector<int>& nums) {for(int i = 1; i < nums.size(); i++){nums[i] = max(nums[i - 1] + nums[i], nums[i]);}int res = nums[0];for(int i = 1; i < nums.size(); i++)res = max(res, nums[i]);return res;}};
class Solution {int dfs(int start, int end, vector<int> nums){if(start == end) return nums[start];int mid = (start + end)>>1;int left = dfs(start, mid, nums);int right = dfs(mid + 1, end, nums);int maxval1 = nums[mid], acc = nums[mid];for(int i = mid - 1; i >= start; i--){acc += nums[i];maxval1 = max(maxval1, acc);}int maxval2 = 0;acc = 0;for(int i = mid + 1; i <= end; i++){acc += nums[i];maxval2 = max(maxval2, acc);}return max(max(left, right), maxval1 + maxval2);}public:int maxSubArray(vector<int>& nums) {return dfs(0, nums.size() - 1, nums);}};
