此题是给定一个数组,找出数组中连续位置(一个区间)中所有数的和并且该和是所有区间中最大的。这个题看起来很难的样子,但是我们仔细想想的话,它的解法挺简单的!
主要思路是使用两个临时值,cursum(用来保存当前和),maxsum(用于保存最大和),方法是。从头到尾依次相加各个数,若当前和cursum > maxsum的话,那么将cursum的值赋给maxsum;若cursum < 0 的话,说明之前的区间最大和已经找出来了且保存在maxsum中了(这一点需要想清楚),这时候应该将cursum的值赋为0,从下一个位置开始找接下来的区间中的最大和,并依此和maxsum比较,知道遍历到最后,maxsum中保存的就是整个数组的子数组中的最大和。
这个题还有一点需要注意,那就是若数组中全部是负数的话,那么我们返回最大的负数即可,我们可以提前判断是否全部是负数,并用一个临时值保存它,最后若真是全负数的话,那么我们直接返回最大负数。代码如下:
class Solution {
public:
int maxSubArray(vector<int>& nums)
{
/*
查找连续的子数组,使其和最大
*/
int len = nums.size();
if (len == 0)
{
return 0;
}
else if (len == 1)
{
return nums[0];
}
size_t pos = 0; //下标
int cursum = 0; //保存最大和
int maxsum = 0; //当前和
//除去开头的负数,并且找到其中的最大的负数,若数组全为负数就要返回该值
int max = nums[0]; //数组最为负数,返回最大负数
while (pos < len && nums[pos] < 0)
{
if (nums[pos] > max)
{
max = nums[pos];
}
++pos;
}
if (pos == len)
{ //全为负数...
return max;
}
//存在正数
while (pos < len)
{
cursum += nums[pos];
if (cursum > maxsum)
{
maxsum = cursum;
}
else if (cursum < 0)
{ //当前和小于0,直接从下一个位置开始计算
cursum = 0;
}
++pos;
}
return maxsum;
}
};
最后的结果如下: