LintCode-乘积最大子序列

找出一个序列中乘积最大的连续子序列(至少包含一个数)。

样例

比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6

分析:访问到每个点的时候,以该点为子序列的末尾的乘积,要么是该点本身,要么是该点乘以以前一点为末尾的序列,注意乘积负负得正,故需要记录前面的最大最小值。

代码:

 

[cpp] view plain copy
 
  1. class Solution {  
  2. public:  
  3.     /** 
  4.      * @param nums: a vector of integers 
  5.      * @return: an integer 
  6.      */  
  7.     int maxProduct(vector<int>& nums) {  
  8.         // write your code here  
  9.         int posMax = nums[0];  
  10.         int negMax = nums[0];  
  11.         int ret = nums[0];  
  12.         for(int i=1;i<nums.size();i++)  
  13.         {  
  14.             int tempPosMax = posMax;  
  15.             int tempNegMax = negMax;  
  16.             posMax = max(nums[i],max(nums[i]*tempPosMax,nums[i]*tempNegMax));  
  17.             negMax = min(nums[i],min(nums[i]*tempPosMax,nums[i]*tempNegMax));  
  18.             ret = max(ret,posMax);  
  19.         }  
  20.         return ret;  
  21.     }  
  22. };  
posted @ 2017-08-22 11:11  天涯海角路  阅读(146)  评论(0)    收藏  举报