152. 乘积最大子序列 - 力扣(LeetCode)

题目描述

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

示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:

输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

题解

仿照最大连续序列和的思想,采用动态规划。dp1[i]表示以nums[i]结尾的序列的最大序列乘积。
但是乘法与加法不同的是,乘法中乘于一个负数可以将原来最小的数变成最大的数。所以这里需多用一个数组统计以nums[i]结尾的最小序列乘积,用于解决符号问题。

代码

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int len = nums.size();
        int max_val = 1 << 30, min_val = -(1 << 30), res = min_val;
        vector<int>dp1(len, min_val);//存放以nums[i]结尾的最大的序列乘积
        vector<int>dp2(len, max_val);//存放以nums[i]结尾的最小的序列乘积(用于解决符号问题)
        for(int i = 0; i < len; ++i){
            if(i == 0){
                dp1[i] = nums[i];
                dp2[i] = nums[i];
            }
            else{
                dp1[i] = max(nums[i], max(dp1[i - 1] * nums[i], dp2[i - 1] * nums[i]));
                dp2[i] = min(nums[i], min(dp1[i - 1] * nums[i], dp2[i - 1] * nums[i]));
            }
            res = max(res, dp1[i]);
        }
        return res;
    }
};

执行结果

在这里插入图片描述

发布了152 篇原创文章 · 获赞 29 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/happyeveryday62/article/details/103631618
今日推荐