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);
}
};