您的位置:首页 > 编程语言

编程之美2.13 子数组的最大乘积

2013-04-21 11:49 330 查看
问题:

给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合中乘积最大的一组。

 

方法一:迭代法

s[i]表示数组前i个元素的乘积。s[i]=s[i-1]*array[i-1]

t[i]表示数组后(N-i)个元素的乘积。t[i]=t[i+1]*array[i]

p[i]表示数组除第i个元素之外,其他N-1个元素的乘积

p[i]=s[i-1] * t[i+1]

由于只需要从头至尾,和从尾至头,扫描数组两次,进而线性时间可以得到p[]

时间复杂度O(N),若要空间复杂度小点的话,可以采用下面的链接中第8题的方法:http://blog.csdn.net/huahuahailang/article/details/8824585

 

#include<iostream>
using namespace std;
#define N 10
int main()
{
int array
;
int s
;
int t
;
int p
;
int i;
int max;
cout<<"请输入"<<N<<"个数字"<<endl;
for (i=0;i<N;i++)
{
cin>>array[i];
}
s[0]=1;//i的前部分
for (i=1;i<N;i++)
{
s[i] =s[i-1]*array[i-1];
}
t[N-1]=1;//i的后部分
for (i=N-2;i>=0;i--)
{
t[i]=t[i+1]*array[i+1];
}
//整合
for (i=0;i<N;i++)
{
p[i]=s[i]*t[i];
}
//比较最大值
max=p[0];
for (i=1;i<N;i++)
{
if (p[i]>max)
{
max=p[i];
}
}
cout<<max<<endl;
return 0;
}


2、方法二

p=array[0]*array[1]*.......array[N-1]

p有3中情况:0,正数,负数

1、p为0的时候,则数组中至少有一个0,除去一个0后,其他N-1个乘积为Q,

      Q=0,则max=0,

      Q>0,则max=Q,

      Q<0,则max=0

2、p>0,则如果数组中有正数,找到最小的正数min,去掉最小的正数,得到乘积Q就是max,

               如果数组中只有负数,找到最小的负数min,去掉最小的负数,得到乘积Q就是max,

3、p<0,  则数组中存在负数,找到最大的负数max,去掉最大的负数,得到乘积Q就是max,

代码如下:

#include<iostream>
using namespace std;
#define N 10
int main()
{
int array
;
int P,Q;
int i;
int position;
int max,min;
int flag=0;
cout<<"请输入"<<N<<"个数字"<<endl;
P=1;
for (i=0;i<N;i++)
{
cin>>array[i];
P *=array[i];
}
if (P==0)
{
for (i=0;i<N;i++)
{
if (array[i]==0)
{
position=i;
break;
}
}
Q=1 ;
for (i=0;i<N;i++)
{
if (i!=position)
{
Q *=array[i];
}
}
if (Q==0)
{
max=0;
}
else
{
if (Q>0)
{
max=Q;
}
else
{
max=0;
}
}
cout<<max<<endl;
}
else
{
if (P>0)
{
for (i=0;i<N;i++)
{
if (array[i]>0)
{
if (flag==0)
{
min=array[i];
position=i;
flag++;
}
else
{
if (min>array[i])
{
min=array[i];
position=i;
}
}
}
}
if (flag==0)//只有负数
{
for (i=0;i<N;i++)
{
if (flag==0)
{
min=array[i];
position=i;
flag++;
}
else
{
if (min>array[i])
{
min=array[i];
position=i;
}
}
}
}
Q=1 ;
for (i=0;i<N;i++)
{
if (i!=position)
{
Q *=array[i];
}
}
max=Q;
cout<<max<<endl;
}
else
{
for (i=0;i<N;i++)
{
if (array[i]<0)
{
if (flag==0)
{
min=array[i];
position=i;
flag++;
}
else
{
if (min<array[i])
{
min=array[i];
position=i;
}
}
}
}
Q=1;
for (i=0;i<N;i++)
{
if (i!=position)
{
Q *=array[i];
}
}
max=Q;
cout<<max<<endl;
}
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: