题目描述:
方法1:动态规划,dp_max与dp_min 分别表示遍历 i 时,以 i 结尾的子数组最大乘积和最小乘积
class Solution {
public:
int maxProduct(vector<int>& nums) {
int dp_max = nums[0];
int dp_min = nums[0];
int n = nums.size();
int m = nums[0];
for(int i=1;i<n;i++){
dp_max = max(nums[i] * dp_max,max(nums[i] * dp_min, nums[i]));
dp_min = min(nums[i] * dp_max,min(nums[i] * dp_min, nums[i]));
m = max(m,dp_max);
}
return m;
}
};
出现错误:
原因:dp_min 使用了更新后的 dp_max 来更新,应该用更新前的 dp_max 来更新
class Solution {
public:
int maxProduct(vector<int>& nums) {
int dp_max = nums[0];
int dp_min = nums[0];
int n = nums.size();
int m = nums[0];
for(int i=1;i<n;i++){
int temp = dp_max;
dp_max = max(nums[i] * dp_max,max(nums[i] * dp_min, nums[i]));
dp_min = min(nums[i] * temp,min(nums[i] * dp_min, nums[i]));
m = max(m,dp_max);
}
return m;
}
};