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

题目:

  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 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值