【算法|动态规划No.12】leetcode152. 乘积最大子数组

个人主页:兜里有颗棉花糖

欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创

收录于专栏【手撕算法系列专栏】【LeetCode

🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助

🍓希望我们一起努力、成长,共同进步。

目录

1️⃣题目描述

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

测试用例的答案是一个 32-位 整数。

子数组 是数组的连续子序列。

示例1:

输入: nums = [2,3,-2,4]

输出: 6

解释: 子数组 [2,3] 有最大乘积 6。

示例2:

输入: nums = [-2,0,-1]

输出: 0

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

注意:

  • 1 <= nums.length <= 2 * 104
  • -10 <= nums[i] <= 10
  • nums 的任何前缀或后缀的乘积都 保证 是一个 32-位 整数

2️⃣题目解析

虽然本题目要求的是求取乘积最大子数组,但是我们还得把乘积最小的情况求取出来。为什么呢?因为不只是正数 * 正数 > 0,还有负数 * 负数 = 正数的情况。

状态表示:

  • f[i]表示以i位置为结尾的所有子数组的最大乘积
  • g[i]表示以i位置为结尾的所有子数组的最小乘积

状态转移方程:

  • f[i] = max(max(nums[i],f[i - 1] * nums[i - 1]),g[i - 1] * nums[i - 1]);
  • g[i] = min(min(nums[i],f[i - 1] * nums[i - 1]),g[i - 1] * nums[i - 1]);

3️⃣解题代码

cpp 复制代码
class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int n = nums.size();
        vector<int> f(n+1);
        auto g = f;
        f[0] = g[0] = 1;
        int ret = INT_MIN;
        for(int i = 1;i <= n;i++)
        {
            int a = nums[i - 1];
            int b = f[i - 1] * nums[i - 1];
            int c = g[i - 1] * nums[i - 1];

            f[i] = max(max(a,b),c);
            g[i] = min(min(a,b),c);
            ret = max(ret,f[i]);
        }
        return ret;
    }
};

通过啦!!!

相关推荐
jz_ddk几秒前
信号处理抽取多项滤波的数学推导与仿真
python·算法·信号处理
float_六七2 分钟前
正则表达式:文本处理的瑞士军刀
算法
IT古董6 分钟前
【漫话机器学习系列】145.软间隔支持向量机(SVM)中的松弛变量(Slack Variable In Soft-margin SVM)
算法·机器学习·支持向量机
JKHaaa24 分钟前
判断是不是完全二叉树(C++)
数据结构·c++·算法
HR Zhou36 分钟前
群体智能优化算法-灰狼优化算法(Grey Wolf Optimizer, GWO,含Matlab源代码)
人工智能·算法·机器学习·matlab·优化·群体智能优化
HR Zhou1 小时前
群体智能优化算法-模拟退火优化算法(Simulated Annealing, SA,含Matlab源代码)
人工智能·算法·机器学习·matlab·优化·模拟退火算法·群体智能优化
阑梦清川2 小时前
蓝桥杯关于栈这个数据结构的一个算法题目
数据结构·算法·蓝桥杯
Luis Li 的猫猫2 小时前
机器学习--卷积神经网络原理及MATLAB回归实现
人工智能·算法·机器学习·matlab·cnn
圣保罗的大教堂2 小时前
《算法笔记》9.4小节——数据结构专题(2)->二叉查找树(BST) 问题 A: 二叉排序树
算法
乔冠宇2 小时前
leetcode热题100道——两数之和
java·javascript·算法·leetcode·职场和发展