給定義個長度爲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; } }
【評價】
題目很簡單,但思路想不出。第二種方法寫的冗長了。