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

相关推荐
phltxy6 小时前
C语言操作符详解
java·c语言·算法
aqiu1111117 小时前
【LeetCode 902】最大为 N 的数字组合 - 详细题解与数位组合思路
数据结构·算法·leetcode·蓝桥杯·数位dp
辰烨chenye7 小时前
LeetCode Hot 100 题解 · 哈希篇
算法·leetcode·哈希算法
罗西的思考8 小时前
DreamZero 与 DreamDojo:世界模型与策略的分层协同综合分析与对比
人工智能·算法·机器学习
玖玥拾8 小时前
LeetCode 219 存在重复元素 II
算法·leetcode·哈希算法·散列表
知无不研9 小时前
c语言中循环的介绍与简单应用
c语言·开发语言·算法·循环·for·while
a1879272183110 小时前
【算法】动态规划第四篇:背包收官——min 哨兵、计数世界与组合排列分水岭
算法·leetcode·动态规划·dp·01背包·算法讲解·决策合并
2601_9622974811 小时前
在python3中、下列输出变量a的正确写法是_2020超星大数据Python免费答案
数据结构·python·算法·编程·字符串操作
辰烨chenye11 小时前
LeetCode Hot 100 题解 · 子串篇
算法·leetcode·职场和发展