C++ 连续子数组的最大乘积

描述

输入一个长度为n的整型数组nums,数组中的一个或连续多个整数组成一个子数组。求所有子数组的乘积的最大值。

1.子数组是连续的,且最小长度为1,最大长度为n

2.长度为1的子数组,乘积视为其本身,比如[4]的乘积为4

3.该题的数据保证最大的乘积不会超过int的范围

数据范围: −100<=𝑎[𝑖]<=100−100<=a[i]<=100

示例1

输入:

复制代码
[3,2,-1,4]

返回值:

复制代码
6

说明:

复制代码
子数组[3,2]的乘积为6,[3,2,-1,4]的乘积为-24,[4]的乘积为4,故返回6
cpp 复制代码
#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int maxProduct(vector<int>& nums) {
        // write code here
        if(nums.empty())
        {
            return 0;
        }

        int n = nums.size();   
        std::vector<int> dp_max(n, 0);
        std::vector<int> dp_min(n, 0);
     
        dp_max[0] = nums[0];
        dp_min[0] = nums[0];

        int res = nums[0]; 
        for(int i = 1; i < n; i++)
        {
            dp_max[i] = std::max(nums[i],  std::max(dp_max[i-1] * nums[i], dp_min[i-1]*nums[i]));
            dp_min[i] = std::min(nums[i], std::min(dp_max[i-1]*nums[i], dp_min[i-1]*nums[i]));

            res = std::max(res, dp_max[i]);
        }
        return res;
    }
};
相关推荐
_OP_CHEN5 小时前
【算法基础篇】(五十七)线性代数之矩阵乘法从入门到实战:手撕模板 + 真题详解
线性代数·算法·矩阵·蓝桥杯·c/c++·矩阵乘法·acm/icpc
天天爱吃肉82185 小时前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车
im_AMBER5 小时前
Leetcode 114 链表中的下一个更大节点 | 删除排序链表中的重复元素 II
算法·leetcode
EmbedLinX5 小时前
嵌入式之协议解析
linux·网络·c++·笔记·学习
xhbaitxl5 小时前
算法学习day38-动态规划
学习·算法·动态规划
多恩Stone5 小时前
【3D AICG 系列-6】OmniPart 训练流程梳理
人工智能·pytorch·算法·3d·aigc
wangjialelele5 小时前
Linux中的进程管理
java·linux·服务器·c语言·c++·个人开发
历程里程碑5 小时前
普通数组----轮转数组
java·数据结构·c++·算法·spring·leetcode·eclipse
pp起床5 小时前
贪心算法 | part02
算法·leetcode·贪心算法
sin_hielo5 小时前
leetcode 1653
数据结构·算法·leetcode