动态规划-152.乘积最大子数组-力扣(LeetCode)

一、题目解析

根据示例nums数组中存在负数,下面分析时需注意

二、算法原理

1、状态表示

此时fi表示:以i位置为结尾的所有子数组中的最大乘积,但是由于nums中存在负数,所以还需要gi表示:以i位置为结尾的所有子数组中的最小乘积

2、状态转移方程

fi=max(numsi,max(fi-1*numsi,gi-1*numsi))

gi的分析过程差不多这里直接给出

gi=min(numsi,min(gi-1*numsi,fi-1*numsi))

3、初始化

由于要使用fi-1和gi-1所以可以选择直接初始化f0和g0,也可以使用虚拟节点,即开辟空间时多开辟一个,用于初始化计算,且为了计算结果不影响后面填表,所以初始化为1,尤为注意我们初始化加了一格,下标的映射关系改变。

4、填表顺序

为了保证所需值已被计算,从左往右,两个表一起填。

5、返回值

根据题目要求我们只需要返回f表中的最大值即可

代码能力是需要实操的,坚持下来,152. 乘积最大子数组 - 力扣(LeetCode)

三、代码示例

cpp 复制代码
class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int n = nums.size();
        vector<int> f(n+1,1),g(n+1,1);
        for(int i = 1;i<=n;i++)
        {
            f[i]=max(nums[i-1],max(f[i-1]*nums[i-1],g[i-1]*nums[i-1]));
            g[i]=min(nums[i-1],min(f[i-1]*nums[i-1],g[i-1]*nums[i-1]));
        }
        int f_max = f[1];
        for(int i = 2;i<=n;i++)
        {
            if(f[i]>f_max) f_max = f[i];
        }
        return f_max;
    }
};

看到最后,如果对您有所帮助,还请点赞、收藏和关注,点点关注不迷路,我们下期再见!

相关推荐
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧11 小时前
C++学习:基础知识的掌握
c++·visualstudio
江畔柳前堤11 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore12 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考14 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX15 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面15 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号16 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽16 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI16 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
C++ 老炮儿的技术栈17 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio