编程之美2.13——子数组的最大乘积

给定义个长度为N的整数数组,只允许用乘法,不能用除法,计算在任意(N-1)的个数的组合中乘积最大的一组。

【思路】

突然变成了雅黑,挺不习惯的~~还是雅黑好看✪ω✪

实现起来很简单,但我是不会想到这样的思路的……看来除了积累别想着有别的途径来提高了π__π

1.用空间换时间,开数组s和t,分别保存从前向后的连乘结果和从后向前的连乘结果。对于每个排除了第i个元素的N-1个元素组合p[i],

有p[i]=s[i-1]*t[i+1],求得所有的p[i],遍历一次即可得最大值。

2.假设N个整数的乘积为P,对P进行正负分析:

1)P=0

数组中至少含有一个0,假设出去该0之外,其他N-1个数的乘积为Q,再根据Q的正负性讨论:

a。Q=0:数组至少有两个0,N-1个数的乘积只能为0,返回0;

b。Q>0:返回Q;

c。Q<0:用0替代任意数值为0,返回0.

2)P>0

如果数组中存在正数,则去掉最小正数,若数组全是负数,则去掉绝对值最大负数。

3)P<0

由负负得正,N个元素去掉一个负数,乘积得到一个正数,则需去掉一个绝对值最小的负数。

【codes】

法一:

int maxMulti(int N[], int n)
{
    int *s=new int[n+1];
    int *t=new int[n+1];
    int *p=new int[n];
    int remax=INT_MIN;
    s[0]=1;
    t[n]=1;
    for(int i=1; i<=n; i++)
        s[i]=s[i-1]*N[i-1];
    for(int i=n-1; i>=0; i--)
        t[i]=t[i+1]*N[i];
    for(int i=0; i<n; i++){
        p[i]=s[i-1]*t[i+1];
        if(p[i]>remax)
            remax=p[i];
    }
    delete [] s;
    delete [] t;
    delete [] p;
    return remax;
}

法二:

int maxMulti1(int N[], int n)
{
    int multi=1;
    for(int i=0; i<n; i++)
        multi*=N[i];
    if(multi==0){
        int q=1;
        int count=0;
        for(int i=0; i<n; i++)
            if(N[i]!=0){
                q*=N[i];
                count++;
            }
        if(count<n-1) return 0;
        else if((count==n-1)&&(q>0)) return q;
        else if((count==n-1)&&(q<0)) return 0;
    }
    else if(multi>0){
        int r=0;
        int j;
        for(int i=0; i<n; i++)
            if(N[i]>r){
                r=N[i];
                j=i;
            }
        if(r==0)
            for(int i=0; i<n; i++)
                if(abs(N[i])>r){
                    r=abs(N[i]);
                    j=i;
                }
        int q=1;
        for(int i=0; i<n&&i!=j; i++)
            q*=N[i];
        return q;
    }
    else if(multi<0){
        int r=0;
        int j;
        for(int i=0; i<n; i++)
            if(abs(N[i]>r)){
                r=abs(N[i]);
                j=i;
            }
        int q=1;
        for(int i=0; i<n&&i!=j; i++)
            q*=N[i];
        return q;    
    }
}

【评价】

题目很简单,但思路想不出。第二种方法写的冗长了。

原文地址:https://www.cnblogs.com/ketchups-notes/p/4519910.html