152. Maximum Product Subarray

来源:互联网 发布:java三天打鱼两天晒网 编辑:程序博客网 时间:2024/03/29 05:36

本题思路不难想,但是需要考虑周全
一个数组里面,数可能有正,负,0,三种
想要获取最大的连续子数组乘积,就需要考虑负数的位置了
当一个数组里没有0的时候,可以分成这样几部分
1.第一个负数(包括该负数)之前的
2.第一个负数之后的到最近的负数(包括该负数)之前的
3.最近的负数之后的数的乘积
例如
假设i=8
数组i=8之前的可以划分为以下三部分

[2,3,-1,2,4,-3,4,3,     -5,2,3,4,5][2,3,-1][2,4,-3][4,3]

当负数个数为0时,最大值为总的乘积
当负数个数为一个的时候,最大值为 第三部分和上一步骤中的较大者
当一共遇到奇数个负数的时候,最大值为第二部分与第三部分的乘积,与前两步骤相比的最大值
当遇到偶数个负数的时候,最大值为总的乘积
当遇到0的时候,三部分都清零,重新开始比较,实际上该问题的解,就是由0分割的子数组,之中的解的最大值

class Solution {public:    int maxProduct(vector<int>& nums) {        if(nums.size()==1) return nums[0];        int max_num=nums[0];        int temp=1;        int temp_=1;        int temp__=1;        int always_plus=1;        for(int i=0;i<nums.size();i++)        {            if(nums[i]==0)             {                if(0>max_num) max_num=0;                temp=1;                temp_=1;                temp__=1;                always_plus=1;            }            else if(nums[i]<0)            {                if(temp_==1)                 {                    temp_=temp*nums[i];                    if(temp_>max_num) max_num=temp_;                }                else                {                        temp__=temp__*temp*nums[i];                    if(temp__<0)                    {                        always_plus=temp__*temp_;                        if(always_plus>max_num) max_num=always_plus;                    }                    else                     {                        always_plus=temp__;                        if(always_plus>max_num) max_num=always_plus;                    }                }                temp=1;            }            else             {                temp*=nums[i];                if(always_plus*temp>max_num) max_num=always_plus*temp;            }        }        return max_num;    }};
0 0