zoukankan      html  css  js  c++  java
  • LeetCode152: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.

    这道题是上面连续子数组和问题的扩展吧。非常遗憾没做来出。状态都定义对了。可是状态转移方程没有写出来。
    能够定义A[i]表示以i结尾的子数组的最大积。B[i]表示以i结尾的子数组的最小积。这里之所以要记录下最小积是为了预防两个负数相乘结果为正数这样的情况。那么状态转移方程是:
    A[i+1]=max{nums[i],nums[i]*A[i],nums[i]*B[i]}
    B[i+1]=min(nums[i],nums[i]*A[i],nums[i]*B[i])
    编写代码时注意须要将A[i]或B[i]先保存成暂时变量。


    最開始时考虑依据nums[i]的正负来更新A[i]和B[i]的值,可是没有准确认识到A[i]和B[i]的转移关系所以导致没有求出来。
    runtime:8ms

    class Solution {
    public:
        int maxProduct(vector<int>& nums) {
            int curMax=nums[0];
            int curMin=nums[0];
            int result=curMax;
            for(int i=1;i<nums.size();i++)
            {
                int tmp=curMin;
                curMin=min(nums[i],min(nums[i]*curMax,nums[i]*curMin));
                curMax=max(nums[i],max(nums[i]*curMax,nums[i]*tmp));
                result=max(result,curMax);
            }
            return result;
        }
    };
  • 相关阅读:
    [Luogu]小Z的AK计划
    [POI2006]OKR-Periods of Words
    [NOI2014]动物园
    [NOI2009]管道取珠
    [IOI2005]河流
    [国家集训队]Crash的文明世界
    [HDU5382]GCD?LCM!
    [AGC027E]ABBreviate
    [CF]Round510
    [NOIp2005]篝火晚会
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5386260.html
Copyright © 2011-2022 走看看