編程之美2.13——子數組的最大乘積

給定義個長度爲N的整數數組,只容許用乘法,不能用除法,計算在任意(N-1)的個數的組合中乘積最大的一組。數組

【思路】spa

忽然變成了雅黑,挺不習慣的~~仍是雅黑好看✪ω✪code

實現起來很簡單,但我是不會想到這樣的思路的……看來除了積累別想着有別的途徑來提升了π__πblog

1.用空間換時間,開數組s和t,分別保存從前向後的連乘結果和從後向前的連乘結果。對於每一個排除了第i個元素的N-1個元素組合p[i],rem

有p[i]=s[i-1]*t[i+1],求得全部的p[i],遍歷一次便可得最大值。class

2.假設N個整數的乘積爲P,對P進行正負分析:遍歷

1)P=0方法

數組中至少含有一個0,假設出去該0以外,其餘N-1個數的乘積爲Q,再根據Q的正負性討論:di

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;    
    }
}

【評價】

題目很簡單,但思路想不出。第二種方法寫的冗長了。

相關文章
相關標籤/搜索