【算法四十七】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)

相关推荐
淘矿人2 小时前
Claude辅助DevOps实践
java·大数据·运维·人工智能·算法·bug·devops
Cosolar2 小时前
万字详解:RAG 向量索引算法与向量数据库架构及实战
数据库·人工智能·算法·数据库架构·milvus
落羽的落羽4 小时前
【算法札记】练习 | Week4
linux·服务器·数据结构·c++·人工智能·算法·动态规划
萑澈4 小时前
算法竞赛入门:C++ STL核心用法与时空复杂度速查手册
数据结构·c++·算法·stl
Godspeed Zhao5 小时前
从零开始学AI16——SVM
算法·机器学习·支持向量机
江屿风5 小时前
C++OJ题经验总结(竞赛)1
开发语言·c++·笔记·算法
nebula-AI5 小时前
人工智能导论:模型与算法(核心技术)
人工智能·深度学习·神经网络·算法·机器学习·集成学习·sklearn
运筹vivo@5 小时前
LeetCode 2405. 子字符串的最优划分
c++·算法·leetcode·职场和发展·哈希表