LeetCode - 152. Maximum Product Subarray - C++

第一种方法DP,并用一维vector进行存取以当前下表开始所能取得的最大连续子数组,在最后一个用例超时

代码:

class Solution {
public:
    int maxProduct(vector<int>& nums) { //dp
        if(1==nums.size())
            return nums[0];
        vector<int> ansstore(nums.size(),INT_MIN);
        int temp;
        for(int i=nums.size()-1;i>=0;--i)
        {
            int tempmax = nums[i];
            ansstore[i] = nums[i];
            for(int j=i-1;j>=0;--j)
            {
                if(0==nums[j]||0==nums[j+1])
                {
                    ansstore[j] = nums[j];
                    int temp = nums[j]>ansstore[j+1]?nums[j]:ansstore[j+1];
                    tempmax = temp>tempmax?temp:tempmax;
                }
                else
                {
                    int temp = ansstore[j+1]*nums[j]>nums[j]?ansstore[j+1]*nums[j]:nums[j];
                    tempmax = temp>tempmax?temp:tempmax;
                    ansstore[j] = ansstore[j+1]*nums[j];
                }
            }
            ansstore[i] = tempmax;
        }
        int ans = ansstore[0];
        for(int i=1;i<ansstore.size();++i)
        {
            if(ansstore[i]>ans)
                ans = ansstore[i];
        }
        return ans;
    }
};

第二种方法 AC:

static int x = []()
{
    std::ios::sync_with_stdio(false);
    cin.tie(NULL);
    return 0;
}();
class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int maxnum = nums[0];
        int minnum = nums[0];
        int ans = nums[0];
        for(int i=1;i<nums.size();++i)
        {
            int temp1 = maxnum*nums[i];
            int temp2 = minnum*nums[i];
            maxnum = max(max(temp1,temp2),nums[i]);
            minnum = min(min(temp1,temp2),nums[i]);
            ans = max(maxnum,ans);
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/qianli2333/article/details/80898868
今日推荐