给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。
样例
给出数组[−2,2,−3,4,−1,2,1,−5,3]
,符合要求的子数组为[4,−1,2,1]
,其最大和为6
如果nums中有正数,从左到右遍历nums,用变量cur记录每一步的累加和,遍历到正数cur增加,遍历到负数cur减少。
当cur>=0时,每一次累加都可能是最大的累加和,所以,用另外一个变量max全程跟踪记录cur出现的最大值即可。
class Solution {
public:
/*
* @param nums: A list of integers
* @return: A integer indicate the sum of max subarray
*/
int maxSubArray(vector<int> nums) {
if(nums.size()<=0){
return 0;
}
int max=INT_MIN,cur=0;//c++最小值
for(int i=0; i<nums.size(); i++)
{
if(cur < 0)
cur = nums[i];//如果前面加起来的和小于0,抛弃前面的
else
cur+=nums[i];
if(cur > max)
max = cur;
}
return max;
}
};
tips:当题目涉及到求最大最小值时,最初的比较数字就应当设置为INT_MAX或INT_MIN,更为安全。<limits.h>中有INT_MAX和INT_MIN的宏定义可直接使用。
或者自行定义宏
#define INT_MAX 0x7fffffff
#define INT_MIN 0x80000000
INT_MAX = 2147483647
INT_MIN = -2147483648
这仅试用在没有限制范围的情况下使用。否则同样会出现其他连锁的错误。