原题
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.
Reference Answer
思路分析
主要需要考虑负负得正这种情况,比如之前的最小值是一个负数,再乘以一个负数就有可能成为一个很大的正数。
这道题相对于最大和子序列多了正负号情况,即不能再简单只保留最大值,因为两个负数的乘积为正。
Code
class Solution:
def maxProduct(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums) == 1:
return nums[0]
res = max_temp = min_temp = nums[0]
for count in nums[1:]:
pre_max, pre_min = max_temp, min_temp
max_temp = max(pre_max*count, count, pre_min*count)
min_temp = min(pre_max*count, count, pre_min*count)
res = max(res, max_temp)
return res
C++版本:
class Solution {
public:
int maxProduct(vector<int>& nums) {
if (nums.size() == 1){
return nums[0];
}
int res = nums[0], min_temp = nums[0], max_temp = nums[0];
for (int i=1; i<nums.size(); ++i){
int pre_max = max_temp;
int pre_min = min_temp;
max_temp = max(max(pre_max*nums[i], nums[i]), pre_min*nums[i]);
min_temp = min(min(pre_max*nums[i], nums[i]), pre_min*nums[i]);
res = max(max_temp, res);
}
return res;
}
};
Note:
- 这道题一个很容易出错的地方是
max_temp = max(pre_max*count, count, pre_min*count)
,若是改为直接用max_temp = max(max_temp *count, count, pre_min*count)
,则结果错误,必须先把上次的值重新保存为一个新变量pre_max
,后面用pre_max
做乘积运算! - 注意C++版本的
max
,min
函数只能处理两个输入的比较,对于三个数的比较只能曲线救国:max_temp = max(max(pre_max*nums[i], nums[i]), pre_min*nums[i]);
参考资料
[1] https://www.cnblogs.com/zuoyuan/p/4019326.html
[2] https://blog.csdn.net/fuxuemingzhu/article/details/83211451