leetcode152

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        if(nums.empty())
            return 0;
        if(nums.size() == 1)
            return nums[0];
            
        int maxAll = nums[0];       //global maximum
        int maxLast = nums[0];      //maximum including last element
        int maxCur;                 //maximum including current element
        int minLast = nums[0];      //minimum including current element
        int minCur;                 //minimum including last element
        for(int i = 1; i < nums.size(); i ++)
        {
            maxCur = max(nums[i], max(maxLast*nums[i], minLast*nums[i]));
            minCur = min(nums[i], min(maxLast*nums[i], minLast*nums[i]));
            maxLast = maxCur;
            minLast = minCur;
            maxAll = max(maxAll, maxCur);
        }
        return maxAll;
    }
};

因为nums可能包含负数,因此之前最小的乘积*当前值,有可能成为最大值;而之前最大的乘积*当前值,有可能成为最小值。

因此,每次计算的时候,把目前的最大乘积和最小乘积都保存下来,用于下一次计算。

补充一个python的实现:

 1 class Solution:
 2     def maxProduct(self, nums: 'List[int]') -> 'int':
 3         n = len(nums)
 4         if n == 0:
 5             return 0
 6         elif n == 1:
 7             return nums[0]
 8         maxAll,preMax,preMin = nums[0],nums[0],nums[0]
 9         curMax,curMin = nums[0],nums[0]
10         for i in range(1,n):
11             curMax = max(nums[i],max(preMax*nums[i],preMin*nums[i]))
12             curMin = min(nums[i],min(preMax*nums[i],preMin*nums[i]))
13             preMax,preMin = curMax,curMin
14             maxAll = max(maxAll,curMax)
15         return maxAll
原文地址:https://www.cnblogs.com/asenyang/p/9812655.html