lintcode--乘积最大子序列

来源:互联网 发布:nba战报今日战报数据 编辑:程序博客网 时间:2024/06/09 16:01

题目描述:

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

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

思路分析:
看到这道题,想起的第一是求最大子序列和的那道题的方法,保存最大值,每次与当前的数相乘,然后把比较是不是最大值,如果是则将其保存,但是转念一想,当数列中有偶数个数的负数时,我们会漏掉这种情况。所以新的方法是保存最大值和最小值,这样当我们遇到负数时,就可以对其进行处理,但是经过测试会发现还是不可以,因为我们还要将原本的数加入与最大值,最小值乘积的比较,这样才可以。
其总结公式就是:

Max[i]=max(data[i],Max[i1]data[i],Min[i1]data[i])
Min[i]=min(data[i],Max[i1]data[i],Min[i1]data[i])

代码实现:

class Solution {public:    /*     * @param nums: An array of integers     * @return: An integer     */    int maxProduct(vector<int> &nums) {        // write your code here        int max=nums[0];        int min=nums[0];        int realmax=nums[0];        for(int i=1;i<nums.size();i++)        {            int tempmax=max;            int tempmin=min;            max=findmax(nums[i],nums[i]*tempmax,nums[i]*tempmin);            min=findmin(nums[i],nums[i]*tempmax,nums[i]*tempmin);            if(max>realmax)            {                realmax=max;            }        }        return realmax;    }    int findmax(int a,int b,int c)    {        return c>((a>b)?a:b)?c:((a>b)?a:b);    }    int findmin(int a,int b,int c)    {        return c>((a>b)?b:a)?((a>b)?b:a):c;    }};
原创粉丝点击