算法设计与分析-Week10

Maximum Product Subarray

题目描述

Given an integer array nums, find the contiguous subarray within an array (containing at least one number) which has the largest product.

Example 1:

Input: [2,3,-2,4]
Output: 6
Explanation: [2,3] has the largest product 6.

Example 2:

Input: [-2,0,-1]
Output: 0
Explanation: The result cannot be 2, because [-2,-1] is not a subarray.

解题思路

本题要在一个整数数组中找到一个连续的子数组,使这个子数组的元素的乘积最大。
考虑到这样一个问题,如果这个数组中不包含0,那么以第一个元素为起点的子数组,随着子数组长度的增加,元素乘积的绝对值肯定是非严格递增的,因此我们只需要维护整个过程中的最小值和最大值,因为负的最小值,乘以一个负数,有可能变成一个最大值,最后直接返回最大值即可。
但是如果这个数组中包含0,那么可以把0当做一个分隔符,当遇到0时,我们其实已经求出了0之前的子数组的最大乘积,已经可以把它放在一边,继续计算0之后的子数组的最大乘积,并使用一个变量result记录整个过程中的最大乘积。

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
int maxProduct(vector<int>& nums) {
int maxP = nums[0], minP = nums[0], result = nums[0];
for(int i = 1; i < nums.size(); i++){
int temp = maxP;
maxP = max(max(maxP * nums[i], minP * nums[i]), nums[i]);
minP = min(min(temp * nums[i], minP * nums[i]), nums[i]);
if(result < maxP) result = maxP;
}
return result;
}
};
0%