题目:找最大的连乘积。
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array [2,3,-2,4]
,
the contiguous subarray [2,3]
has the largest product = 6
.
解法:
动态规划。pos[i]表示从某一位起连乘到第i位的绝对值的最大值。neg[i]表示从某一位起连乘到第i位的最小的负值。
pos[i]是nums[i],nums[i-1]*pos[i-1],nums[i-1]*neg[i-1] 中的最大值
neg[i]是num[i],nums[i-1]*pos[i-1],nums[i-1]*neg [i-1]中的最小值
复杂度:O(n).
代码:
class Solution {
public:
int maxProduct(vector<int>& nums) {
if(nums.size()==0) return 0;
int pos=nums[0],neg=nums[0];//连乘到当前位的最大值和绝对值最大的负值
int maxProduct=nums[0];
for(int i=1;i<nums.size();i++)
{
int temp1=max(nums[i]*pos,nums[i]*neg);
int temp2=min(nums[i]*pos,nums[i]*neg);
pos=max(nums[i],temp1);//连乘可能会断开,所以要注意加上这两句
neg=min(nums[i],temp2);
if(maxProduct<pos) maxProduct=pos;
}
return maxProduct;
}
};