给定一个整数数组 nums
,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
暴力解一发,居然能过,数据也太水了吧。不过看看时间和空间,很惨。
class Solution {
public:
int maxProduct(vector<int>& nums) {
if(nums.size()==0){
return 0;
}
int maxn = -99999;
int s;
for(int i=0;i<nums.size();i++){
s = 1;
for(int j=i;j<nums.size();j++){
s = s*nums[j];
maxn = max(s,maxn);
}
maxn = max(s,maxn);
}
return maxn;
}
};
执行用时 : 428 ms, 在Maximum Product Subarray的C++提交中击败了6.27% 的用户
内存消耗 : 9.2 MB, 在Maximum Product Subarray的C++提交中击败了25.92% 的用户
DP题解:
Mx[i] Mn[i] 数组代表至少包含第i个数的 最大 最小 值子数组乘积
那么最大的值只可能是Mx[i-1]*nums[i] , Mn[i-1]*nums[i] , 和nums[i]这三个数其中之一。
用这三个值更新 Mx[i] , Mn[i] , 再用Mx[i]更新maxn为答案。
执行用时 : 8 ms, 在Maximum Product Subarray的C++提交中击败了97.12% 的用户
内存消耗 : 9.3 MB, 在Maximum Product Subarray的C++提交中击败了10.88% 的用户
/*class Solution {
public:
int maxProduct(vector<int>& nums) {
if(nums.size()==0){
return 0;
}
int maxn = -99999;
int s;
for(int i=0;i<nums.size();i++){
s = 1;
for(int j=i;j<nums.size();j++){
s = s*nums[j];
maxn = max(s,maxn);
}
maxn = max(s,maxn);
}
return maxn;
}
};*/
class Solution {
public:
int maxProduct(vector<int>& nums) {
int maxn = nums[0];
if(nums.size()==0){
return 0;
}
if(nums.size()==1){
return nums[0];
}
vector<int> Mx(nums.size(),0);
vector<int> Mn(nums.size(),0);
Mx[0] = nums[0];
Mn[0] = nums[0];
for(int i=1;i<nums.size();i++){
Mx[i] = max(Mx[i-1]*nums[i],max(nums[i],Mn[i-1]*nums[i]));
Mn[i] = min(Mx[i-1]*nums[i],min(nums[i],Mn[i-1]*nums[i]));
maxn = max(maxn,Mx[i]);
}
return maxn;
}
};