leetcode maximum product subarray

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.

Subscribe to see which companies asked this question

 
一道medium的题目,我自己的思考过程复杂化了,首先我先想到的是可能出现的情况,如果负数为偶数的话,就是正数了,那么返回自身就好;如果负数为奇数,要看最后一个负数前面的子串和后面的子串的product谁大。还有0的情况,数组里有几个0,就会将数组分成几个部分,于是觉得这道题复杂极了。对于medium的题,我每次先自己怂了。==
 
后来看了一个别人的解法。思路非常清晰:首先获得最大的product就三种情况;curMax保存当前最大子串的乘积,curMin保存当前最小子串的乘积。
第一种:如果nums[i]>0,那么max=curMax*nums[i];
第二种:如果nums[i]<0,那么max=curMin*nums[i];
第三种:max=nums[i]
这样思路就比较简单也比较清楚。而且时间复杂非常低。之后我也附上“暴力破解”。
class Solution {
public:

    int maxProduct(vector<int>& nums) {
        int temp=0;
        int len=nums.size();
        if(len<=0) return 0;
        if(len==1) return nums[0];
        int curMax=nums[0];
        int curMin=nums[0];
        int result=nums[0];
        for(int i=1;i<len;i++){
            temp=curMin*nums[i];
            curMin=min(nums[i],min(temp,curMax*nums[i]));
            curMax=max(nums[i],max(temp,curMax*nums[i]));
            result=max(result,curMax);
        }
        return result;
    }
};

暴力破解:

// 思路:用两个指针来指向字数组的头尾
int maxProduct(int A[], int n)
{
    assert(n > 0);
    int subArrayProduct = -32768; 
    
    for (int i = 0; i != n; ++ i) {
        int nTempProduct = 1;
        for (int j = i; j != n; ++ j) {
            if (j == i)
                nTempProduct = A[i];
            else
                nTempProduct *= A[j];
            if (nTempProduct >= subArrayProduct)
                 subArrayProduct = nTempProduct;
        }
    }
    return subArrayProduct;
}

 感觉有些题目要从结果来分析,就像这道题,而有的题目要从条件来分析就像以前做的有些题目。心得,哈哈。

原文地址:https://www.cnblogs.com/LUO77/p/4950008.html