给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。

LeetCode 专栏收录该内容
60 篇文章 0 订阅

题目描述

给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。

题目分析

这时一个很典型的动态规划题目,数组不一定是有序的,而且连续子序列中的符号也不一定一致,这是两点需要注意的,详细思路请见源代码。

源代码

class Solution {
public:
    int maxProduct(vector<int>& nums) 
    {
        if(nums.empty()) return 0;
        int ret, pos, neg;
        pos = nums[0];
        neg = nums[0];
        ret = nums[0];
        for(int i = 1; i < nums.size(); i++)
        {
            int temp = pos;
            //最大值乘以负数有可能变为最小值,最小值乘以负数有可能变为最大值
            pos = max(nums[i], max(pos * nums[i], neg * nums[i]));//在不断的计算最大值
            neg = min(nums[i], min(temp * nums[i], neg * nums[i]));//在不断的计算最小值
            ret = max(pos, ret);
        }
        return ret;
    }
};

  • 1
    点赞
  • 0
    评论
  • 3
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

Tom Hardy

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值