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

通过啦!!!

相关推荐
To_OC7 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
2401_841495647 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
爱刷碗的苏泓舒11 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
烬羽14 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米14 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
REST_302715 小时前
告别Excel孤岛:一款任务链路可视化工具带来的真实改变
大数据·微服务·云计算·编辑器·excel·动态规划
星空露珠15 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
QXWZ_IA16 小时前
桥梁数字孪生怎么落地?
人工智能·科技·算法·智能硬件·政务
Kel17 小时前
输出层与反分词(Output Layer & Detokenization)
人工智能·算法·架构