【算法|动态规划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;
    }
};

通过啦!!!

相关推荐
补三补四1 小时前
支持向量机(一)
算法·机器学习·支持向量机
Zz_waiting.3 小时前
java数据结构_二叉树_5.4
数据结构·算法
天亮有惊喜3 小时前
基于改进型灰狼优化算法(GWO)的无人机路径规划
算法·matlab·路径规划·灰狼优化算法·gwo
程序员东min3 小时前
Python:凯撒密码
python·算法
Luo_LA4 小时前
【LeetCode Hot100 多维动态规划】最小路径和、最长回文子串、最长公共子序列、编辑距离
算法·leetcode·动态规划
若兰幽竹4 小时前
【机器学习】超参数的选择,以kNN算法为例
算法·机器学习
C7211BA4 小时前
降维算法概述
算法·信息可视化·数据分析
程序猿零零漆5 小时前
《从入门到精通:蓝桥杯编程大赛知识点全攻略》(十一)-回文日期、移动距离、日期问题
java·算法·蓝桥杯
豆豆酱5 小时前
强化学习到大模型训练理论概要(一)
人工智能·算法
invincible_Tang5 小时前
贪心算法(题7)货仓选址
算法·贪心算法