题目描述
给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续 子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。
请注意,一个只包含一个元素的数组的乘积是这个元素的值。
示例 1:
输入 : nums = [2,3,-2,4]
输出 : 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入 : nums = [-2,0,-1]
输出 : 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
提示:
1<=nums.length<=2∗1041 <= nums.length <= 2 * 10^41<=nums.length<=2∗104
-10 <= nums[i] <= 10
nums 的任何子数组的乘积都 保证 是一个 32-位 整数
思路
前后缀秒了,我们用0将数组分成多个小数组,很明显答案要么是某个前缀,要么是某个后缀。
利用反证法,如果是中间部分,说明不能和左边的连接,那么左边的结果是负数,同理说明右边结果是负数,如果两边都是负数,那么是可以连接成正数的,与中间部分是答案相矛盾。
因此答案要么是某个前缀,要么是某个后缀。
代码
cpp
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n = nums.size();
int mx = INT_MIN;
int pre = 0;
int suf = 0;
for(int i = 0; i < n; ++i)
{
if(pre == 0) pre = 1;
pre *= nums[i];
mx = max(mx, pre);
}
for(int i = n - 1; i; --i)
{
if(suf == 0) suf = 1;
suf *= nums[i];
mx = max(mx, suf);
}
return mx;
}
};