给定一个长度为n的整数数组,只允许用乘法,不能用除法,请计算任意n-1个数的组合中乘积最大的一组。
方法一:暴力解决
从第一个数开始,算出每一个n-1个数相乘的结果,并设置一个max更新每次乘积的值。这种方法的时间复杂度为O(n*n)。
/*************************************************************************
> File Name: MaxS.cpp
> Author: jimmy
> Mail: 1011933119@qq.com
> Created Time: 2016年10月21日 星期五 09时21分03秒
************************************************************************/
#include<iostream>
using namespace std;
int MaxSS(int a[],int n)
{
int i,j;
int result,max=1;
for(i=0;i<n;i++)
{
result = 1;
for(j=0;j<n;j++)
{
if(i!=j)
result = result *a[j];
}
if(result > max)
max = result;
}
return max;
}
int main()
{
int a[5]={3,2,5,4,3};
cout<<MaxSS(a,5)<<endl;
return 0;
}
2.用空间换取时间
假设现在求出去a[i]的n-1乘积,需要求a[i]之前的乘积和a[i]之后的乘积,然后把左右相乘。
先计算每个a[i]之前的乘积和每个a[i]之后的乘积。这样用两个for循环,时间复杂度为o(n).
然后再遍历一遍数组,比较前后乘积的大小,找出最大值。
/*************************************************************************
> File Name: MaxS.cpp
> Author: jimmy
> Mail: 1011933119@qq.com
> Created Time: 2016年10月21日 星期五 09时21分03秒
***********************************************************************/
#include<iostream>
#include<cstring>
using namespace std;
class MaxS{
public:
MaxS(int n_,int a_[])
{
n = n_;
for(int i=0;i<n_;i++)
{
a[i]=a_[i];
}
}
int maxSS()
{
int l[n],r[n],i;
int max = a[0];
l[0] = a[0];
r[n-1] = a[n-1];
for(i=1; i<n; i++)
l[i] = l[i-1] * a[i];
for(i= n-2; i>=0 ; i--)
r[i] = r[i+1] * a[i];
int left,right,temp;
for(i=0;i<n;i++)
{
if(i == 0)
left = 1;
else
left = l[i-1];
if(i == n-1 )
right = 1;
else
right = r[i+1];
temp = left * right;
if( temp > max)
{
max = temp;
}
}
return max;
}
void print()
{
int i;
for( i=0;i < n; i++)
cout<<a[i]<<" ";
}
private:
int n;
int a[];
};
int main()
{
int a[5]={5,2,1,4,3};
MaxS mm(5,a);
mm.print();
cout<<mm.maxSS()<<endl;
return 0;
}