Runtime: 4 ms, faster than 87.06% of C++ online submissions for Maximum Product Subarray.
Memory Usage: 7 MB, less than 100.00% of C++ online submissions for Maximum Product Subarray.
典型的动态规划,因为起点和终点都是不确定的,这里设置一个vector,其index对应在index处终止的所有可能的子串的最大和最小值组成的pair。
重点在于理解,该问题与子问题之间的关系,即在index处结束的最大product与在index-1处结束的最大product之间的关系,绝不仅仅是前一个最大值乘以当前num,原因在于若当前num为负数,与前一个最小值product相乘才能得到当前最大product。
class Solution {
public:
int maxProduct(vector<int>& nums) {
vector<pair<int, int>> products(nums.size());
products[0] = make_pair(nums[0], nums[0]);//max, min
int max_pro, min_pro;
for(size_t index = 1; index < nums.size(); ++index){
if(nums[index] >= 0){
max_pro = max(products[index-1].first*nums[index], nums[index]);
min_pro = min(products[index-1].second*nums[index], nums[index]);
}else{
max_pro = max(products[index-1].second*nums[index], nums[index]);
min_pro = min(products[index-1].first*nums[index], nums[index]);
}
products[index] = make_pair(max_pro, min_pro);
}
int max_product = products[0].first;
for(const auto& p : products){
if(p.first > max_product)
max_product = p.first;
}
return max_product;
}
};