题解 | #连续子数组的最大乘积#
连续子数组的最大乘积
https://www.nowcoder.com/practice/fd8c819c07c9493887bfac8549c119f4
#include <iostream>
#include <math.h>
#include <vector>
using namespace std;
int main() {
int n;
//因为a数组中可能全为负数,因此必须将maxnumber设定为足够小的数字才行
int maxnumber = -1e9;
cin >> n;
vector<int> a(n, 0);
for (auto i = 0; i < n; i++) {
cin >> a[i];
}
if (n <= 1) {
cout << a[0];
return 0;
}
//利用dq_max[i]来保存到第i个元素为止的最大乘积
vector<int> dq_max(n + 1, 0);
//利用dq_min[i]来保存到第i个元素为止的最小乘积,之所以需要这个,
//是因为序列中可能存在因为负数而使得原本的最大结果变为最小结果,
//但这个最小结果也可能在后续过程中乘上一个负数重新变为最大结果,因此我们需要将它保存下来
vector<int> dq_min(n + 1, 0);
dq_max[1] = a[0];
dq_min[1] = a[0];
for (auto i = 1; i <= n; i++) {
//比较 dq_max[i - 1]与第i个元素的乘积、第i个元素、dq_min[i - 1]与第i个元素的乘积 这三者的大小,取其中最大结果
dq_max[i] = max(max(dq_max[i - 1] * a[i - 1], a[i - 1]),
dq_min[i - 1] * a[i - 1]);
//比较 dq_max[i - 1]与第i个元素的乘积、第i个元素、dq_min[i - 1]与第i个元素的乘积 这三者的大小,取其中最小结果
dq_min[i] = min(min(dq_min[i - 1] * a[i - 1], a[i - 1]),
dq_max[i - 1] * a[i - 1]);
//maxnumber永远只需要保存最大结果,因此只需要与 dq_max 相比较
maxnumber = max(maxnumber, dq_max[i]);
}
cout << maxnumber;
return 0;
}
#include <math.h>
#include <vector>
using namespace std;
int main() {
int n;
//因为a数组中可能全为负数,因此必须将maxnumber设定为足够小的数字才行
int maxnumber = -1e9;
cin >> n;
vector<int> a(n, 0);
for (auto i = 0; i < n; i++) {
cin >> a[i];
}
if (n <= 1) {
cout << a[0];
return 0;
}
//利用dq_max[i]来保存到第i个元素为止的最大乘积
vector<int> dq_max(n + 1, 0);
//利用dq_min[i]来保存到第i个元素为止的最小乘积,之所以需要这个,
//是因为序列中可能存在因为负数而使得原本的最大结果变为最小结果,
//但这个最小结果也可能在后续过程中乘上一个负数重新变为最大结果,因此我们需要将它保存下来
vector<int> dq_min(n + 1, 0);
dq_max[1] = a[0];
dq_min[1] = a[0];
for (auto i = 1; i <= n; i++) {
//比较 dq_max[i - 1]与第i个元素的乘积、第i个元素、dq_min[i - 1]与第i个元素的乘积 这三者的大小,取其中最大结果
dq_max[i] = max(max(dq_max[i - 1] * a[i - 1], a[i - 1]),
dq_min[i - 1] * a[i - 1]);
//比较 dq_max[i - 1]与第i个元素的乘积、第i个元素、dq_min[i - 1]与第i个元素的乘积 这三者的大小,取其中最小结果
dq_min[i] = min(min(dq_min[i - 1] * a[i - 1], a[i - 1]),
dq_max[i - 1] * a[i - 1]);
//maxnumber永远只需要保存最大结果,因此只需要与 dq_max 相比较
maxnumber = max(maxnumber, dq_max[i]);
}
cout << maxnumber;
return 0;
}