题目:
- 在一个数组中,以i为界限,分别计算i前面s[i-1]的积,后面t[i+1]的积
p[i]=s[i-1]*t[i+1]即为这个数组中除去i的所有数的乘积。
时间复杂度为,从头到尾和从尾到头遍历数组得到s[]和t[]的时间,加上p[]的时间3N,加上查找最大值的时间复杂度,最后总得时间复杂度为O(n)。
注意在代码编写的过程中,因为若干个数的乘积较大,需要把数组定义为longlong型
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXN 1000
long long A[MAXN];
long long s[MAXN];
long long t[MAXN];
long long p[MAXN];
int main()
{
int n, i;
cin >> n;
for (i=1; i<=n; i++)
cin >> A[i];
// 从前往后用叠乘法
s[0] = 1;
for (i=1; i<n; i++)
s[i]=A[i]*s[i-1];
// 从后往前用叠乘法
t[n+1] = 1;
for (i=n; i>1; i--)
t[i]=A[i]*t[i+1];
// 计算出n-1个n-1数连乘
for (i=0; i<=n-1; i++)
p[i] = s[i]*t[i+2];
long long maximum = p[0];
// 获取其中的最大值
for (i=1; i<=n-1; i++)
maximum = max(maximum, p[i]);
cout <<"max is "<< maximum << endl;
}