2.13子数组的最大乘积
问题:给定一个长度为N 的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度。
----------------------------------------
看到这个题目,我的第一感觉是只要找到该数组中最小的数,然后排除这个数不就可以吗?
但是问题是如果数据都是正数还好,上面的办法可以实现,但是如果有负数,问题就比较难办。我们采用最基本的方法,就是把任意的N-1个数抽取,然后有N次这样的组合,算法的时间复杂度为:O(N^2)
我们可以很快的写出代码:
#include <iostream>
using namespace std;
void func1(int a[], const int n)
{
float b[10]={1,1,1,1,1,1,1,1,1,1};
for (int i = 0;i<n;i++)
{
for(int j = 0;j<n;j++)
{
if(i == j)
{
}
else
{
b[i] = b[i]*a[j];
}
}
cout<<b[i]<<endl;
b[i]=1;
}
}
void main()
{
int a[10] = {1,3,4,0,2,1,2,9,3,4};
func1(a,10);
}
第二种方法:
using namespace std;
void func2(int a[], const int n)
{
int s[11];//定义前n个数的积
int t[11];//定义后n个数的积
int p[11];//积
s[0] = 1;
t[n] = 1;
//输出数组前1-n的乘积
for(int m =1;m<n+1;m++)
{
s[m] = s[m-1]*a[m-1];
cout<<s[m]<<' ';
}
cout<<endl;
//输出后n-1的乘机
for(int k=n-1;k>-1;k--)
{
t[k] = t[k+1]*a[k];
cout<<t[k]<<' ';
}
cout<<endl;
for(int v= 1;v<n+1;v++)
{
p[v] = s[v]*t[v+1];
cout<<p[v]<<endl;
}
}
浙公网安备 33010602011771号