又是动态规划的题哦。这道题与最大子数组和的区别在于,两个负数乘积会为正。
所以就会想:想要正值的时候要最大的正值,想要负值的时候取最小的负值
我康的一个比较好的讲解在这里
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n = nums.size();
if(!n) return 0;
int ans = nums[0];
int premin = nums[0],premax = nums[0];
int dpmin,dpmax;
for( int i = 1; i < n ; ++ i){
dpmin = min(nums[i],min(nums[i]*premin , nums[i]*premax));
dpmax = max(nums[i],max(nums[i]*premin , nums[i]*premax));
ans = max(dpmax,ans);
premax = dpmax; premin = dpmin;
}
return ans;
}
};
dp的速度有一点慢,但是题解区的正反求最大值的方法没看懂啊。。。
class Solution:
def maxProduct(self, A):
B = A[::-1]
for i in range(1, len(A)):
A[i] *= A[i - 1] or 1
B[i] *= B[i - 1] or 1
return max(max(A),max(B))