Leetcode 152. Maximum Product Subarray (最大乘積子序列)
阿新 • • 發佈:2018-12-03
原題
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