问题:求数组的子数组之和的最大值
算法:
1、求得数组 的第一个正数的下标 和 最后一个正数的下标
2、通过下标判断,如果该数组的值都是负值,那么从数组中取最大值输出。否则进行下一步。
3、将相邻的正数合并,相邻的负数合并。形成正负相间的数组
4、将第一个正数和下一个负数相加,如果结果大于零,那么加到下一个正数里面,如果小于零,那么不加到下一个正数里面。遍历整个正负相间的数组,选出相加最大的值,即为最大值。
注意:算法实现为了实现更高的效率,将第三步和第四步合并。
时间复杂度:O(n)
代码实现:
<span style="font-size:14px;">int maxSubArray(vector<int>& nums) {
int pos_begin=-1; //first pos num
int pos_end=-1; //last neg num
int result=0;
int sum_pos=0;
/*取第一个正数的下标和最后一个正数的下标*/
for(int i=0;i<nums.size();i++)
{
if(nums[i]>0)
{
pos_begin=i;
break;
}
}
for(int i=nums.size()-1;i>=0;i--)
{
if(nums[i]>0)
{
pos_end=i;
break;
}
}
// cout<<pos_begin<<" "<<pos_end<<endl;
/*对于全是负数的处理*/
if(-1==pos_begin)
{
result=nums[0];
for(int i=0;i<nums.size();i++)
{
if(result<nums[i])
{
result=nums[i];
}
}
return result;
}
else
{
for(int i=pos_begin;i<=pos_end;i++)
{
sum_pos+=nums[i];
if(sum_pos>result)
result=sum_pos;
if(sum_pos<=0)
sum_pos=0;
}
return result;
}
}</span>