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

相关推荐
sali-tec5 小时前
C# 基于OpenCv的视觉工作流-章84-包胶有无检测
图像处理·人工智能·opencv·算法·计算机视觉
Irissgwe6 小时前
数据结构-排序
数据结构·算法·排序算法
小O的算法实验室6 小时前
2025年IEEE TITS,基于动态聚类粒子群算法的无人机任务分配与路径规划
算法
Tairitsu_H6 小时前
[LC优选算法#5] 分治:快排 | 颜色分类 | 排序数组 | 第K大元素
c++·算法·leetcode·排序算法·快速排序
青山木6 小时前
Hot 100 --- 滑动窗口最大值
java·数据结构·算法·leetcode·动态规划
青山木6 小时前
Hot 100 --- 除自身以外数组的乘积
java·数据结构·算法
Frank学习路上6 小时前
【C++】面试:STL容器与算法
c++·算法·面试
10岁的博客6 小时前
NOIP2010普及组「接水问题」详解:模拟算法与优先队列解法
开发语言·c++·算法
彼岸星光ぐ>6 小时前
排序算法对比
数据结构·算法·排序算法