152. 乘积最大子数组
常规解法: DP
求数组中子区间的最大乘积,对于乘法,我们需要注意,负数乘以负数,会变成正数,所以解这题的时候我们需要维护两个变量,当前的最大值,以及最小值,最小值可能为负数,但没准下一步乘以一个负数,当前的最大值就变成最小值,而最小值则变成最大值了。
class Solution { public: int maxProduct(vector<int>& nums) { int n = nums.size(); if(n == 0){ return 0; } else if(n == 1) { return nums[0]; } int p = nums[0]; int maxP = nums[0]; int minP = nums[0]; for(int i = 1; i < n; i++) { int t = maxP; maxP = max(max(maxP * nums[i], nums[i]), minP *nums[i]); minP = min(min(t * nums[i], nums[i]), minP * nums[i]); p = max(maxP, p); } return p; } };
Ad hoc解法:
如果全为正数,则整个数组的乘积最大;
若奇数个数为偶数,依然可以将整个数组乘起来得到最大值;
若为奇数个,则可以丢掉最左或最右的那个奇数;
若中途有0, 需要更新当前乘积为1。
class Solution { public: int maxProduct(vector<int>& nums) { int n = nums.size(); if(!n) return 0; int ans = 1, res = nums[0]; for(int i = 0; i < n; i++) { ans *= nums[i]; res = max(ans, res); if(!nums[i]) ans = 1; } ans = 1; for(int i = n - 1; i >= 0; i--) { ans *= nums[i]; res = max(ans, res); if(!nums[i]) ans = 1; } return res; } };
浙公网安备 33010602011771号