【剑指offer】面试题42:连续子数组的最大和——附0x80000000与INT_MIN

在这里插入图片描述

方法一:暴力法(超时)

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值