int size = nums.size();
if(size == 1)
{
return nums[0];
}
int max = -2147483648, max_num, sum;
bool flag_r = 1, flag_l = 1;
for(int num = 0; num < size; num++)
{
if(max < nums[num])
{
max = nums[num];
max_num = num;
}
}
//cout << max << endl;
sum = max;
if(max_num > size - 2)
{
flag_l = 0;
}
for(int num = max_num + 1; num < size - 1; num++)
{
flag_r = 0;
if(nums[num] < 0)
{
if(nums[num] + nums[num+1] < 0)
{
flag_r = 1;
break;
}
else
{
sum += nums[num];
}
}
else
{
sum += nums[num];
}
}
//cout << sum << endl;
if(!flag_r && (nums[size-1] > 0))
{
sum += nums[size-1];
}
cout << sum << endl;
if(max_num - 1 == 0)
{
flag_l = 0;
}
for(int num = max_num - 1; num > 0; num--)
{
flag_l = 0;
if(nums[num] < 0)
{
if(nums[num-1] + nums[num] < 0)
{
flag_l = 1;
break;
}
else
{
sum += nums[num];
}
}
else
{
sum += nums[num];
}
}
cout << sum << endl;
if(!flag_l && (nums[0] > 0))
{
sum += nums[0];
}
return sum ;
最开始打算找到最大值然后往两侧延伸但是有部分对总和有贡献的子数组依旧无法识别 如最大值为10 子数列5 -1 -2对总和有贡献 但被舍弃。
参考柳X的算法,直接遍历 存在2个变量 总和和临时和,均初始化为nums[0],若temp<0 则temp舍弃,将其赋0再与nums[i]相加,否则直接加上nums[i]再与总和比较。总和始终为最大值。若temp>0会一直加下去,总和为temp最大的时候。
int size = nums.size();
if(size == 0)
{
return 0;
}
int ans = nums[0], temp = nums[0];
for(int i = 1; i < size; i++)
{
if(temp > 0)
{
temp = temp + nums[i];
}
else
{
temp = nums[i];
}
ans = max(ans, temp);
}
return ans;
浙公网安备 33010602011771号