Leetcode 53.Maximum Subarray
题目描述
输入:一个数组
输出:该数组中,最大连续子序列和
如:
Input:[-2,1,-3,4,-1,2,1,-5,4]
Output:6 //[4,-1,2,1]
代码
int max = 0;//for saving the max sum of sub array
bool init = false;
//recursion for computing sum of sub array
//from left to right
int maxSubArr(int* nums, int l, int r){
//return only on object
if(l==r){
if(!init){
max = nums[l];
init = true;
}
return nums[l];
}else{
//compare sum of the right subArr and current item
//if larger return current item and right subArr
//else return current item
int sumr = maxSubArr(nums,l+1,r);
max = sumr>max?sumr:max;
if(sumr>0){
int sum =nums[l]+sumr;
max = sum>max?sum:max;
return nums[l]+sumr;
}else{
max = nums[l]>max?nums[l]:max;
return nums[l];
}
}
}
int maxSubArray(int* nums, int numsSize) {
init = false;
max = 0;
maxSubArr(nums,0,numsSize-1);
return max;
}
算法描述
采用递归的方式计算从下标为0到数组尾部各子序列的和,同时利用全局变量max存储最大子序列的和。
网上solution里面,都是根据当前子序列sum进行判断,若sum<0,则重设子序列。进行迭代。
2. DP
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int sum = 0;
int maxsum = nums[0];
for(int i = 0;i<nums.size();i++){
maxsum = max(sum+nums[i],maxsum);
if((sum+nums[i])<0){
sum = max(0,nums[i]);
}else{
sum +=nums[i];
}
}
return maxsum;
}
};
算法描述
采用动态规划的方式,sum表示到当前下标的最大子序列和;maxsum表示当前各个下标中最大的子子序列和。其中,状态转移方程如下:
sum={sum+num[i]max(num[i],0) if sum+num[i]>0 if sum+num[i]<0
复杂度 O(n)