您的位置:首页 > 其它

152. Maximum Product Subarray

2016-04-12 20:34 357 查看
本题思路不难想,但是需要考虑周全

一个数组里面,数可能有正,负,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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: