计算组合中乘积最大的一组

来源:互联网 发布:linux操作mysql数据库 编辑:程序博客网 时间:2024/06/14 16:27

给定一个长度为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;}
0 0
原创粉丝点击