[leetcode] 152.Maximum Product Subarray

来源:互联网 发布:成都青年旅舍 知乎 编辑:程序博客网 时间:2024/06/11 21:57

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

For example, given the array [2,3,-2,4],
the contiguous subarray [2,3] has the largest product = 6.
题意:
找出最大乘积的子数组,返回该最大乘积。
思路:
对于乘法,需要考虑两个情况 正数*负数= 负数,正数*0 = 0。
所以该数组中的k个0将把数组划分成k+1个块。
然后考虑这k+1个不含0的块,如果里面的负数的个数是偶数个,那么毋庸置疑,这个块最大的乘积就是这个区域所有元素的最大成绩。如果是奇数个负数,那么最大的乘积是舍去一个负数,我们可以将这个块再次划分,划分为Ai,…Aj,…Am,…An其中Aj和Am是这个块最左端和最右段的两个负数,这个块最大的值应该是Ai到A(m-1)或者A(j+1)到An之间。为什么是这两个之间呢?首先要去除一个负数,假设去除的是在Aj和Am之间Ak,那么最大的结果是Ai到A(k-1)或者A(k+1)到Aj,都比刚才两个区间要小。所以问题变成了这两个段的较大值。
对于这样的块,我们可以正向,反向扫描求积,保存两者的较大值。比如-1,-2,-3,从前往后扫描最大值是2,从后往前扫描最大值是6,故取最大值是6。
代码如下:

class Solution {public:    int maxProduct(vector<int>& nums)     {        int size = nums.size();        if(size == 0)return 0;        long long max_res = INT_MIN;        long long t1 = 1;        long long t2 = 1;        for(int i = 0; i < size; i++)        {            t1 *= nums[i];            t2 *= nums[size - i - 1];            max_res = max(t1, max_res);            max_res = max(t2, max_res);            if(nums[i] == 0)                 t1 = 1;            if(nums[size - i - 1] == 0)                t2 = 1;        }        return max_res;    }};
0 0
原创粉丝点击