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

相关推荐
冻柠檬飞冰走茶8 分钟前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
雪落漂泊28 分钟前
C++算法 二分查找篇(上)
开发语言·c++·算法
LabVIEW开发2 小时前
LabVIEW 连接板:28 个端子怎么排,优先级怎么定
java·算法·labview
严肃小白兔4 小时前
MATLAB 数值计算中的精度与误差问题:浮点运算、误差传播与数值稳定性
人工智能·算法·matlab
青少儿编程课堂5 小时前
蓝桥杯青少组图形化省考报名倒计时·全国青少年信息素养大赛·电子学会图形化考级:校园黑白棋人机对战解析
c++·python·算法·bfs·信息学竞赛
jktantan6 小时前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·后端·算法·spring cloud·系统架构
Dream it possible!18 小时前
LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)
算法·leetcode·面试·动态规划
心抵鹊19 小时前
算法之双指针系列(一)
算法·leetcode
十二19 小时前
【洛谷题解】P1083 [NOIP 2012 提高组] 借教室(二分答案 + 差分)
数据结构·c++·算法·蓝桥杯
小此方20 小时前
[算法实战论:动态规划]回文串问题的dp解法,回文串问题的母题,以及以此为基础的派生题
算法·动态规划