一、题意
给出一个整数数组 nums(整数数组) ,求连续相乘积的最大值(相邻下标加在一起),包括单个元素的情况。
二、解法
解法:
因为是乘法,要考虑正负情况,正数的话,就是求根据之前的最大值求最大值,而负数,负数越小,乘以负数,反而有可能是最大值。
在求到i为止最大值的同时,要求出到i为止最小值,为下次使用。
m
a
x
[
i
]
=
m
a
x
{
m
a
x
[
i
−
1
]
∗
n
u
m
s
[
i
]
,
n
u
m
s
[
i
]
,
m
i
n
[
i
−
1
]
∗
n
u
m
s
[
i
]
}
max[i]=max\{max[i-1]*nums[i],nums[i],min[i-1]*nums[i]\}
max[i]=max{max[i−1]∗nums[i],nums[i],min[i−1]∗nums[i]}
m
i
n
[
i
]
=
m
i
n
{
m
a
x
[
i
−
1
]
∗
n
u
m
s
[
i
]
,
n
u
m
s
[
i
]
,
m
i
n
[
i
−
1
]
∗
n
u
m
s
[
i
]
}
min[i]=min\{max[i-1]*nums[i],nums[i],min[i-1]*nums[i]\}
min[i]=min{max[i−1]∗nums[i],nums[i],min[i−1]∗nums[i]}
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
三、代码
1、解法
int maxProduct(vector<int>& nums) {
int n = nums.size();
int minN=nums[0];
int maxN=nums[0];
int maxN1= nums[0];
for(int i=1;i<n;i++){
int mx = maxN;
maxN=max(mx*nums[i],max(nums[i],minN*nums[i]));
minN=min(mx*nums[i],min(nums[i],minN*nums[i]));
maxN1 = max(maxN,maxN1);
}
return maxN1;
}