描述

输入一个长度为 $n$ 的整型数组 $nums$,数组中的一个或连续多个整数组成一个子数组。求所有子数组的乘积的最大值。

1.子数组是连续的,且最小长度为 $1$ ,最大长度为 $n$

2.长度为 $1$ 的子数组,乘积视为其本身,比如 $[4]$ 的乘积为 $4$

3.该题的数据保证最大的乘积不会超过 int 的范围,即不超过 $2^{32}-1$

数据范围:

$1<= n<=2×10^5$

$−100<= a[i]<=100$

输入描述:

第一行输入一个正整数 $n$ ,表示数组的长度

第二行输入 $n$ 个整数,表示数组中的值。

输出描述:

输出子数组的乘积的最大值

示例1

输入:

4
3 2 -2 4

输出:

6

说明:

子数组 $[3,2]$ 的乘积为 $6,[3,2,-1,4]$ 的乘积为 $-24,[4]$ 的乘积为 $4$,故返回 $6$

示例2

输入:

3
-3 0 -2

输出:

0

说明:

因为 $0$ 在中间,所有包含 $0$ 的子数组的乘积都为 $0$,另外的数都是负数,所以最大乘积的子数组为$[0]$,返回为$0$,因为子数组要求是连续的,所以 $[-3,-2]$ 不是 $[-3,0,-2]$ 的子数组,所以不能为 $6$,

示例3

输入:

3
-3 2 -2

输出:

12

题解

#include<iostream>
using namespace std;
const int N = 2e5+10;
int a[N];
int n;

int main() {
    cin >> n;
    for(int i = 0; i < n; i++) cin >> a[i];
    int mi = a[0], mx = a[0], res = a[0];
    for(int i = 1; i < n; i++) {
        int v1 = mi * a[i], v2 = mx * a[i];
        mx = max(a[i], max(v1, v2));
        mi = min(a[i], min(v1, v2));
        res = max(res, mx);
    }
    cout << res << endl;
    return 0;
}
Last modification:April 3, 2022
如果觉得我的文章对你有用,请随意赞赏