题解 | #连续子数组的最大乘积#

连续子数组的最大乘积

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;
}
全部评论

相关推荐

07-03 16:02
门头沟学院 Java
点赞 评论 收藏
分享
Southyeung:我说一下我的看法(有冒犯实属抱歉):(1)简历不太美观,给我一种看都不想看的感觉,感觉字体还是排版问题;(2)numpy就一个基础包,机器学习算法是什么鬼?我感觉你把svm那些写上去都要好一点。(2)课程不要写,没人看,换成获奖经历;(3)项目太少了,至少2-3个,是在不行把网上学习的也写上去。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务