码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-07-08 22:12:36      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:osi   遍历   one   变量   自己的   span   全局最优   exp   根据   

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;
    }
}

 

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

标签:osi   遍历   one   变量   自己的   span   全局最优   exp   根据   

原文地址:https://www.cnblogs.com/tengdai/p/9281299.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!