乘积最大子序列

问题:

        找出一个序列中乘积最大的连续子序列(至少包含一个数)。

解题思路:

        该题是典型的动态规划问题,考虑到序列中存在负数的情况,需要定义两个辅助数组,一个存储以当前元素结尾的最大乘积,一个记录以当前元素结尾的最小乘积。

int maxProduct(vector<int>& nums) {
        // write your code here
        int size = nums.size();
        if(size < 1)
            return 0;
//创建辅助数组,记录以当前元素结尾的最大乘积            
        int *curmax = new int[size];
        int *curmin = new int[size];
        memset(curmax, 0, sizeof(int) * size);
        memset(curmin, 0, sizeof(int) * size);
//填充辅助数组        
        int maxnum = nums[0];
        curmax[0] = nums[0];
        curmin[0] = nums[0];
        for(int i = 1; i < size; i++){
            curmax[i] = max(nums[i], max(nums[i] * curmax[i - 1], nums[i] * curmin[i - 1]));
            curmin[i] = min(nums[i], min(nums[i] * curmin[i - 1], nums[i] * curmax[i - 1]));
            if(curmax[i] > maxnum){
                maxnum = curmax[i];
            }
        }

        return maxnum;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值