leetcode152. 乘积最大子数组
没做出来,直接看题解
灵神题解:
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n = nums.size();
vector<int> fMin(n);//右端点下标为 i 的子数组的最小乘积
vector<int> fMax(n);//右端点下标为 i 的子数组的最大乘积
fMin[0] = nums[0];fMax[0] = nums[0];
for(int i = 1;i < n;++i){
fMin[i] = min({fMin[i-1]*nums[i],fMax[i-1]*nums[i],nums[i]});//不用min嵌套使用,直接用大括号{}
fMax[i] = max({fMin[i-1]*nums[i],fMax[i-1]*nums[i],nums[i]});
}
return ranges::max(fMax);
}
};
空间优化:
class Solution {
public:
int maxProduct(vector<int>& nums) {
int res = INT_MIN;//答案可能是负数
int f_max = 1, f_min = 1;
for (int &x : nums) {
int mx = f_max;//f_max = max({})先执行,所以先把f_max旧的值先保存起来
f_max = max({f_max * x, f_min * x, x});
f_min = min({mx * x, f_min * x, x});
res = max(res, f_max);
}
return res;
}
};