给定一个整数数组 nums
,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
解题思路:
最大乘积本质上与最大和是一样的,但是由于存在负数,所以需要同时记录最小值和最大值.
每次都更新maxend,minend.
那么状态转移方程为:
maxend = max(max(maxend*data[i] , minend*data[i]) , data[i]);
minend = min(min(maxend*data[i] , minend*data[i]) , data[i]);
初始状态为 maxend = minend = data[0];
为什么非要比较data[i]而不是和之前的maxend or minend 比较呢?因为它是一个连续的串,所以必须每一个部分都要乘进来,如果是一个不连续的最大乘积,那么是与之前的maxend or minend作比较
code:
class Solution {
public:
/**
* @param nums: a vector of integers
* @return: an integer
*/
int maxProduct(vector<int>& nums) {
// write your code here
int maxend= nums[0];
int minend= nums[0];
int ret = nums[0];
for(int i=1;i<nums.size();i++)
{
int tempPosMax = maxend;
int tempNegMax = minend;
maxend= max(nums[i],max(nums[i]*tempPosMax,nums[i]*tempNegMax));
minend= min(nums[i],min(nums[i]*tempPosMax,nums[i]*tempNegMax));
ret = max(ret,maxend);
}
return ret;
}
}