【Leetcode】152. Maximum Product Subarray

来源:互联网 发布:朱雀投资怎么样知乎 编辑:程序博客网 时间:2024/06/07 01:43

Description:

Find the contiguous subarray within an array (containing at least one number) which has the largest product.

Example:

Given the array [2,3,-2,4], the contiguous subarray [2,3] has the largest product = 6.


思路:

这道题与53.Maximum Subarray相似,53题是求最大连续子数组的和,本题是求最大连续子数组的积。与求和不同,求积的时候,数值0和负数会对整体带来较大影响,因此需要将其纳入考虑。同样的,类似求和,运用逐步迭代求最大值的方法来把最大的积求出来,在这里,我们需要引入两个辅助参数pos和neg来区分正负值,pos的值在前面一直累乘的积与当前值中取最大值,而neg在之前累乘的积与0中取最小值,这样可以保证pos,neg两者的绝对值都是大值。由于pos和neg的值会在当前值为负数时进行交换,这是保证pos的值最大,同时可把最小的值但其绝对值可能最大的数存起来,存到参数neg中,以便遇到偶数倍个负数进行交换,再度确保pos的值达到最大。

下面是用C++的实现过程。

class Solution{    public:    int maxProduct(vector<int>& arr){        int len=arr.size();        if(len==1) return arr[0];  //当只有一个元素时        int pos,neg;        pos = max(arr[0],0);        neg = min(arr[0],0);        int max_product = pos;        for (int i=1;i<len;i++){            if(arr[i]==0){                pos=0;                neg=0;            }            if(arr[i]<0) swap(pos,neg);            pos = max(arr[i],arr[i]*pos);            neg = min(arr[i],arr[i]*neg);            max_product = max(max_product,pos);        }        return max_product;    }};
0 0
原创粉丝点击