题目描述:
解法一(DP):
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.size()==1) return nums[0];
int res=nums[0],temp=nums[0];
for(int i=1;i<nums.size();i++){
if(temp<=0)
temp=nums[i];
else temp+=nums[i];
res=max(res,temp);
}
return res;
}
};
解法二(分治):
class Solution {
//分治算法
private int divide(int[] nums, int left, int right){
if(left == right) return nums[left];
if(left == right - 1){
int max;
max = Math.max(nums[left], nums[right]);
max = Math.max(max, nums[left] + nums[right]);
return max;
}
int mid = (left + right) >> 1;
int lSum = divide(nums, left, mid - 1);
int rSum = divide(nums, mid + 1, right);
int max = nums[mid];
int sum = max;
for(int i = mid - 1; i >= left; i--){
sum += nums[i];
max = Math.max(max, sum);
}
sum = max;
for(int j = mid + 1; j <= right; j++){
sum += nums[j];
max = Math.max(max, sum);
}
max = Math.max(max, lSum);
max = Math.max(max, rSum);
return max;
}
public int maxSubArray(int[] nums) {
return divide(nums, 0, nums.length-1);
}
}