方法一:暴力法(超时)
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n= nums.size();
int res=-1e8;
for(int i=0;i<n;i++){
int sum=0;
for(int j=i;j<n;j++) {
sum+=nums[j];
res=max(res,sum);
}
}
return res;
}
};
方法二:
1、如果当前的nSum小于0的话,则可以把前面累加的都舍弃,只把nSum等于当前的nums[i]
2、把一个最小的数给记录最终最大值的结果。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if( nums.size() == 0 )
return 0;
int nSum=0;
//int greatSum=0x80000000;
int greatSum=INT_MIN;//求最大值的结果给 最小的数
for( int i=0; i<nums.size(); i++ )
{
//当sum小于0时,就从下一个数重新开始
if( nSum < 0 )
nSum = nums[i];
else
nSum += nums[i];
if(nSum > greatSum)
greatSum=nSum;
}
return greatSum;
}
};
方法三:动态规划
dp[i] 对应f(i)
class Solution {
public:
int maxSubArray(vector<int>& nums) {
vector<int> dp(nums.size());
dp[0]=nums[0];
int res=dp[0];
for(int i = 1; i < nums.size() ; i++ ) {
if( dp[i-1] <= 0 )
dp[i]=nums[i];
else
dp[i]=dp[i-1]+nums[i];
res= max( dp[i], res);
}
return res;
}
};
附:方法二中用到C/C++中的常量:
INT_MIN
INT_MIN在头文件limits.h中
因为int占4字节32位,根据二进制编码的规则,INT_MAX = 2^31-1,INT_MIN= -2^31
INT_MAX + 1 = INT_MIN
INT_MIN - 1 = INT_MAX
abs(INT_MIN) = INT_MIN
INT_MAX + 1 < INT_MAX, INT_MIN - 1 > INT_MIN, abs(INT_MIN) < 0
0x80000000
0x80000000 的二进制位
原码 1000 0000 0000 0000 0000 0000 0000 0000
若最高位为符号位,则为-0,可是输出int i = 0x80000000
i = -(2^31)