• 【leetcode】 Unique Binary Search Trees (middle)☆


    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,一切都设为初始值。

    对于两个0之间的数若有奇数个负数,那则有两种情况,第一种是不要第一个负数和之前的值,第二种是不要最后一个负数和之后的值,用negtiveFront和negtiveBack表示。没有负数就是不要第一个负数和之前的值的情况。

    int maxProduct(int A[], int n) {
            if(n == 0)
                return 0;
    
            int MaxAns = A[0];
            int negtiveFront = (A[0] == 0) ? 1 : A[0];
            int negtiveBack = (A[0] < 0) ? 1 : 0;
    
            for(int i = 1; i < n; i++)
            {
                if(A[i] == 0)
                {
                    MaxAns = (MaxAns > 0) ? MaxAns : 0;
                    negtiveFront = 1;
                    negtiveBack = 0;
                }
                else if(A[i] < 0)
                {
                    negtiveFront *= A[i];
                    MaxAns = max(negtiveFront, MaxAns);
                    if(negtiveBack == 0)
                    {
                        negtiveBack = 1;
                    }
                    else
                    {
                        negtiveBack *= A[i];
                        MaxAns = max(negtiveBack, MaxAns);
                    }
                }
                else
                {
                    negtiveFront *= A[i];
                    negtiveBack *= A[i];
                    MaxAns = max(negtiveFront, MaxAns);
                    if(negtiveBack > 0)
                    {
                        MaxAns = max(negtiveBack, MaxAns);
                    }
                    
                }
            }
    
            return MaxAns;
        }

    答案的思路:同时维护包括当前数字A[k]的最大值f(k)和最小值g(k)

    f(k) = max( f(k-1) * A[k], A[k], g(k-1) * A[k] )
    g(k) = min( g(k-1) * A[k], A[k], f(k-1) * A[k] )

    再用一个变量Ans存储所有f(k)中最大的数字就可以了

    int maxProduct2(int A[], int n) {
            if(n == 0)
                return 0;
    
            int MaxAns = A[0]; //包括当前A【i】的连续最大乘积
            int MinAns = A[0]; //包括当前A【i】的连续最小乘积
            int MaxSoFar = A[0]; //整个数组的最大乘积
    
            for(int i = 1; i < n; i++)
            {
                int MaxAnsTmp = MaxAns;
                int MinAnsTmp = MinAns;
                MaxAns = max(MaxAnsTmp * A[i], max(MinAnsTmp * A[i], A[i]));
                MinAns = min(MinAnsTmp * A[i], min(MaxAnsTmp * A[i], A[i]));
                MaxSoFar = max(MaxSoFar, MaxAns);
    
            }
    
            return MaxSoFar;
        }
  • 相关阅读:
    HTML+CSS+JS设计注册页面
    1.20学习总结
    Linux安装python3
    Linux命令
    vue安装
    Python实现发送邮件
    C语言带参数的main函数
    Fibonacci 数列递归 重复计算
    gray code 格雷码 递归
    河内塔
  • 原文地址:https://www.cnblogs.com/dplearning/p/4158432.html
Copyright © 2020-2023  润新知