题目描述:
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
解题分析:
由于存在负数*负数取得最大值得情况,所以维护一个minProductVec,记录负数。状态方程为:
maxProductVec[i]=max(maxProductVec[i-1]*nums[i-1], max(minProductVec[i-1]*nums[i-1], nums[i-1]));
minProductVec[i]=min(minProductVec[i-1]*nums[i-1], min(maxProductVec[i-1]*nums[i-1], nums[i-1]));
class Solution {
public:
int maxProduct(vector<int>& nums) {
if(nums.size()==0)
return 0;
int numsSize=nums.size();
vector<int> maxProductVec(numsSize+1,1);
vector<int> minProductVec(numsSize+1,1);
int maxProduct=nums[0];
for(int i=1; i<=numsSize; ++i){
maxProductVec[i]=max(maxProductVec[i-1]*nums[i-1], max(minProductVec[i-1]*nums[i-1], nums[i-1]));
minProductVec[i]=min(minProductVec[i-1]*nums[i-1], min(maxProductVec[i-1]*nums[i-1], nums[i-1]));
maxProduct=max(maxProduct, maxProductVec[i]);
}
return maxProduct;
}
};