(Java) LeetCode 152. Maximum Product Subarray —— 乘积最大子序列

Given an integer array nums, find the contiguous subarray within an array (containing at least one number) which has the largest product.

Example 1:

Input: [2,3,-2,4]
Output: 6
Explanation: [2,3] has the largest product 6.

Example 2:

Input: [-2,0,-1]
Output: 0
Explanation: The result cannot be 2, because [-2,-1] is not a subarray.

 

暴力解法应该会超时吧,直接考虑用动态规划。用dp[i]来存储以nums[i]为结尾的数组的子序列的最大乘积。有一个问题是根据dp[i-1]求dp[i]时,需要判断nums[i]对全局的影响。因为符号对乘法的影响会使结果不能作为局部最优解,但仍然保留着成为全局最优解的可能。所以同时需要用两个变量存储当前最大的正数乘积,以及最小的负数乘积。当遍历到nums[i]时需要同时更新dp[i],maxPositive以及minNegative。具体的递推是,更新maxPositive,minNegative,之后dp[i]取dp[i-1]和maxPositive中的最大值。更新最大正乘积以及最小负乘积时要记得考虑只有元素自己的情况,并且要分别独立更新。当然本题不需要存储dp[0] ~ dp[i-1],因为dp[i]严格的只和dp[i-1]有关,所以只需要一个dp来存储上一个位置即可,空间可以优化成常数。

 


Java

class Solution {
    public int maxProduct(int[] nums) {
        if (nums == null || nums.length == 0) return 0;
        int maxP = nums[0], minN = nums[0], dp = nums[0];
        for (int i = 1; i < nums.length; i++) {
            int locMax = nums[i] * maxP, locMin = nums[i] * minN;
            maxP = Math.max(nums[i], Math.max(locMax, locMin));
            minN = Math.min(nums[i], Math.min(locMax, locMin));
            dp = Math.max(dp, maxP);
        }
        return dp;
    }
}

 

转载于:https://www.cnblogs.com/tengdai/p/9281299.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值