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

来源:互联网 发布:初中微机考试模拟软件 编辑:程序博客网 时间:2024/06/05 03:54

题目:

  1. 在一个数组中,以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 1000long 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;}