[LeetCode]Maximum Product Subarray

寻找数组中乘积最大的连续子数组,例如在[2,3,-2,4]中,子数组[2,3]乘积最大为6。题目可以通过动态规划解决,维护当前连续子数组的最大值curMax和最小值curMin,利用局部最优解求全局最优解。" 117470346,10793182,Java面试必备:200+面试题覆盖全模块,"['Java', '面试', '技术复习', '并发编程', 'JVM']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Find the contiguous subarray within an array (containing at least one number) which has the largest product.

For example, given the array [2,3,-2,4],
the contiguous subarray [2,3] has the largest product = 6.

这道题是找出数组中的一个子序列,要求这个子序列中数的乘积是所有子序列中最大的。

如果不考虑效率与优化问题,可以直接将所有子序列的组合列举出来,分别求它们的积,取最大值。如下:

int maxProduct(int A[], int n) {
        int i = 0, j = 0,k=0;
        int ans = 0;
        int product = 0;
        for (i = n; i > 0; i--){
            for (j = 0; j <= n-i; j++){
                for (k = j; k < i; k++){
                    product += A[k];
                }
                if (product>ans){
                    ans = product;
                }
                product = 0;
            }
        }
        return ans;
    }

但是这样的效率是很低的。换个思路可以想到,这道题就是一维动态规划中的“局部最优与全局最优”。所以需要维护两个变量,当前位置连续乘积的最大值curMax和最小值curMin。

最大值与最小值由以下三种情况可以得到:上一次的curMax*A[i],上一次的curMin*A[i],A[i]本身。如下:

int maxProduct(int A[], int n) {
        int ans = A[0];
        int curMin = A[0];
        int curMax = A[0];
        int cur = 1;
        for (int i = 1; i < n; i++){
            cur = curMax;
            curMax = max(max(A[i],A[i]*curMax),A[i]*curMin);
            curMin = min(min(A[i], A[i] * cur), A[i] * curMin);
            ans = max(ans, curMax);
        }
        return ans;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值