Lintcode的第42题最大子数组的和这道题开始的时候会让人会想的很多感觉没有解决问题的思路很容易写出循环嵌套的暴力解题的算法,其实简单的想想这个问题是很容易解决的。
首先将数组分成两类:1包含正数的数组2不包含整数的数组。
对于包含正数的数组的处理比较复杂,咱们这里先不说线索对于不包含正数的数组的处理:
不包含正数的数组
数组不包含正数的解题思路是获取整个数组中的最大值并返回最大值就可以了,所以对于不包含正数的数组就是找到最大值的问题。
对于包含正数的数组:
咱们先看一下这个数组[2,-2,4,5,-17,5,10,18,-12];
这个数组应该是最具有代表性的数组,咱们的解题思路是:
(1)获取此数之前最大的累加和,对于累加和为负值或者为0的进行抛弃设置累加值为0,对于是正值更新累加和。
(2)判断当前累加和是否大于之前存储的最大值,对于累加和大于最大值的进行更新最大值。
(3)循环执行上述步骤至数组结束。
所以上面的过程简述为:
(1)输入数据2,当前累加值为0,累加后为2,当前最大值为0,更新最大值为2
(2)输入数据-2,当前累加值为2,累加后为0,进行抛弃,累加值为0,当前最大值为2,保持最大值为2
(3)输入数据4,当前累加值为0,累加后为4,当前最大值为2,更新最大值为4
(4)输入数据5,当前累加值为4,累加后为9,当前最大值为4,更新最大值为9
(5)输入数据-17,当前累加值为9,累加后为-8,进行抛弃,设置累加值为0,当前最大值为9,保持最大值9。
(6)输入数据5,当前累加值为5,累加后为5,当前最大值为9,保持最大值为9.
(7)输入数据10,当前累加值为5,累加后为15,当前最大值为9,更新最大值为15.
(8)输入数据18,当前累加值为15,累加后为33,当前最大值为15,更新最大值为33.
(9)输入数据-12,当前累加值为33,累加后为21,当前最大值为33,保持最大值为33
(10)结束返回最大值为33
程序为:
int maxSubArray(vector<int> &nums) {
int i=0;
int max=0;
int sum=0;
int data=nums.at(0);
for(i=0;i<nums.size();i++)
{
sum+=nums.at(i);
if(data<nums.at(i))
{
data=nums.at(i);
}
if(sum<0)
{
sum=0;
}
else
{
if(sum>max)
{
max=sum;
}
}
}
if(data<0)
{
max=data;
}
return max;
}