【算法四十七】152. 乘积最大子数组

152. 乘积最大子数组

动态规划:

java 复制代码
class Solution {
    public int maxProduct(int[] nums) {
        //子问题:以nums[i]结尾的整数前面最大的乘积


        //maxDp[i] 表示:以 nums[i] 结尾的连续子数组的最大乘积
        //minDp[i] 表示:以 nums[i] 结尾的连续子数组的最小乘积


        //可以优化为prevMax,prevMin,因为maxDp[i]只与前面的数有关


        //不仅要整理最大乘积,也要整理最小乘积,因为存在负数翻身的情况

        //状态方程: maxDp[i] = Math.max(nums[i],nums[i]*maxDp[i-1],nums[i]*minDp[i-1])
               //  minDp[i] = Math.min(nums[i],nums[i]*maxDp[i-1],nums[i]*minDp[i-1])

        //max = Math.max(nums[i],Math.max(prevMax*nums[i],prevMin*nums[i]))
        //min = Math.min(nums[i],Math.min(prevMin*nums[i],prevMin*nums[i]))

        //从左到右

        // int n = nums.length;
        // int[] maxDp = new int[n];
        // int[] minDp = new int[n];
        // int ans = nums[0];

        // //初始值
        // maxDp[0] = nums[0];
        // minDp[0] = nums[0];

        // for(int i = 1;i<n;i++){
        //     //这里要有两次Math.max和Math,min
        //     maxDp[i] = Math.max(nums[i],Math.max(nums[i]*maxDp[i-1],nums[i]*minDp[i-1]));
        //     minDp[i] = Math.min(nums[i],Math.min(nums[i]*maxDp[i-1],nums[i]*minDp[i-1]));
        //     ans = Math.max(ans,maxDp[i]);
        // }
        // return ans;

        int n = nums.length;
        int ans = nums[0];
        int max = nums[0];
        int min = nums[0];

        for(int i = 1;i<n;i++){
            int prevMax = max;
            int prevMin = min;

            max = Math.max(nums[i],Math.max(prevMax*nums[i],prevMin*nums[i]));
            min = Math.min(nums[i],Math.min(prevMax*nums[i],prevMin*nums[i]));
            ans = Math.max(ans,max);
        }
        return ans;
    }
}

时间复杂度:O(N)

空间复杂度:O(1)

相关推荐
黄金龙PLUS1 小时前
5个1024比特大状态置换算法的设计与分析
算法·网络安全·密码学·哈希算法·同态加密
心中有你02141 小时前
C语言埃氏筛法(素数筛选)
c语言·数据结构·算法
Omics Pro2 小时前
Cell封面|衰老生物学开源AI工具包
数据库·人工智能·算法·机器学习·自然语言处理
UIU1145 小时前
递归算法与汉诺塔
c++·学习·算法·c#·递归
用户9799848071810 小时前
200 行代码写一个能跑的 AI Agent:不依赖任何框架,只靠 tool-calling 原理
算法
threerocks10 小时前
【Muse实战】X 流量作战室搭建保姆级教程 - 拥有你自己的运营团队
算法
GreenTea10 小时前
深度拆解 ScienceBuddy:如何用“双层递归自进化”构建高可靠科研 Agent Harness
前端·后端·算法
花椒技术10 小时前
2.46 秒生成 5 秒视频:拆解 H3 Max 的模型、推理栈与硬件协同
算法·音视频开发·视频编码
vivo互联网技术10 小时前
ART:妆容迁移框架,重新定义高保真妆容迁移 | ECCV 2026
人工智能·算法·图像识别
用户04414409244910 小时前
卫星信号模拟器里的四个坐标转换公式
算法