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

连续子数组的最大乘积

https://www.nowcoder.com/practice/fd8c819c07c9493887bfac8549c119f4

#include <iostream>
#include<algorithm>
#include<string>
using namespace std;

//int dp[10000][10000];//由于最后的暴力解
int dp1[1000000];//用于存储以i结尾的连续子串的最大正数积,若该积不是正数存入该节点的值
int dp2[1000000];//用于存储以i结尾的连续子串的绝对值最大的负数积,若该积不是负数存入该节点的值
int main() {
    int n;
    cin >> n;
    int a[n];
    int tmpup, tmpdown;
    for (int i = 0; i < n; i++)cin >> a[i];
    for (int i = 0; i < n; i++) {//初始化两个dp 在上述存入该节点值的情况下就不用再赋值
        dp1[i] = a[i];
        dp2[i] = a[i];
    }
    for (int i = 1; i < n; i++) {
        if (a[i] == 0) {//0乘任何数为0
            dp1[i] = 0;
            dp2[i] = 0;
        }
        if (dp1[i - 1]*a[i] > 0 || dp2[i - 1]*a[i] > 0) {//看看当前节点乘前一个节点的dp1和dp2是否有正数,有则考虑dp1【i】的值发生变化
            tmpup = max(dp1[i - 1] * a[i], dp2[i - 1] * a[i]);//找出i结尾的最大正数积
            dp1[i] = max(a[i], tmpup);//看看这个积和该节点的值那个大
        }
        if (dp1[i - 1]*a[i] < 0 || dp2[i - 1]*a[i] < 0) {
            tmpdown = min(dp1[i - 1] * a[i], dp2[i - 1] * a[i]);
            dp2[i] = min(a[i], tmpdown);//类似地找出i结尾的绝对值最大负数积
        }

    }
    int maxn = a[0];
    for (int i = 0; i < n; i++)maxn = max(maxn, dp1[i]);
    cout << maxn << endl;

}
 /*暴力解能解一半
 for(int i=0;i<n;i++)//j-i的乘积
 for(int j=0;j<i;j++){
    int tmp=1;
    for(int k=j;k<=i;k++)tmp=tmp*a[k];
    dp[i][j]=tmp;
 }
 int maxn=0;
 for(int i=0;i<n;i++)//j-i的乘积
 for(int j=0;j<n;j++)maxn=max(maxn,dp[i][j]);

   cout<<maxn<<endl;*/


全部评论

相关推荐

前辈们好!晚辈是一名在读硕士生,研究方向是计算机视觉、6D位姿估计、手术导航。按照目前的简历水平,请问能否够得着一些互联网大厂的实习面试资格呢,可以申请哪些类型的岗位呀?在考虑算法工程师,但是相比于计算机科班的同学,自己的项目经历还有刷题似乎有些薄弱了。简历还可以在哪些方面进行修改呢?提前感谢大家!
神哥不得了:神哥过年也来解答啦,简历这样写提升空间很大呀,算法的话要求顶刊顶会,如果有的话就会比较好找,看不出来你这两个是不是顶刊顶会,这些课题的话,对找工作帮助没有那么大,如果走算法的话应该会比较难,但是也不是完全没机会的状态
点赞 评论 收藏
分享
Cassifa:发的字比你都多的一律视为骗子或者想白嫖压榨实习生的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务