LeetCode
- 地址:https://leetcode.com/problems/maximum-product-subarray/#/description
- 问题描述:求的是一个连续的子序列,使得乘积最大,注意因为都是整数,所以除了×0之外,都会让数的绝对值变大或者起码不变。那么可以理解成,0是分割点,如果都是正的,那么只需要对两个0+起始点和结束点划分的连续子序列不断求积即可,只要比记录的最大值大就好了。如果有负数的话就比较麻烦,比如-2,3,4,-5,-6这样,顺着乘就会发现,最大的是-2到-5,120,而其实是3到-6,360.所以问题在于顺着乘可能会出现这种情况,所以需要反着乘,同时比较两者哪个大。其实上述问题简单来说就是,如果最大序列被夹在3个负数中间假设是A,B,C,那么就需要判断A的绝对值大还是C的大,中间的B是没有影响的,所以用两种顺序一定能找到最大值。代码如下:
- 代码:
class Solution {
public:
int max(int a, int b) {return a > b ? a : b;}
int maxProduct(vector<int>& nums) {
int frontProduct = 1;
int backProduct = 1;
int ans = INT_MIN;
int n = nums.size();
for (int i = 0; i < n; ++i) {
frontProduct *= nums[i];
backProduct *= nums[n - i - 1];
ans = max(ans,max(frontProduct,backProduct));
frontProduct = frontProduct == 0 ? 1 : frontProduct;
backProduct = backProduct == 0 ? 1 : backProduct;
}
return ans;
}
};