0
点赞
收藏
分享

微信扫一扫

[leetcode] 152. Maximum Product Subarray


Description

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.

分析

题目的意思是:找到一个连续子数组,使得它们的乘积最大。

1)如果当前元素为正数,那么极大值只可能扩大,所以应该继续扩展当前subarray:
2)如果当前元素为负数,那么极大值可能会变小,所以不清楚应该继续扩展当前subarray还是新起一个subarray:
3)如果当前元素为0,那么包括一个0会使得极大值成为0,而按照操作规定,这里的极大值应该大于等于1,所以应该舍弃当前元素,新起一个subarray.
对于第2中情况,我们用两个数组分别记录遍历的极大值和极小值,因此最大值只可能从nums[i],mums[i]*dp_max[i-1],nums[i]*dp_min[i-1]中产生。想一想看是不是这个道理。

代码

class Solution {
public:
int maxProduct(vector<int>& nums) {
int result=nums[0];
vector<int> dp_max(nums.size(),0);
vector<int> dp_min(nums.size(),0);
dp_max[0]=dp_min[0]=nums[0];
for(int i=1;i<nums.size();i++){
dp_max[i]=max(nums[i],max(dp_max[i-1]*nums[i],dp_min[i-1]*nums[i]));
dp_min[i]=min(nums[i],min(dp_max[i-1]*nums[i],dp_min[i-1]*nums[i]));
result=max(dp_max[i],result);
}
return result;
}
};

参考文献

​​[LeetCode] Maximum Product Subarray 求最大子数组乘积​​​​[LeetCode] Maximum Product Subarray的4种解法​​


举报

相关推荐

0 条评论