给定义个长度为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; } }
【评价】
题目很简单,但思路想不出。第二种方法写的冗长了。
时间: 2024-10-14 00:35:47