ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

乘积最大子数组

2021-08-04 23:32:44  阅读:210  来源: 互联网

标签:dp2 dp1 nums int num 数组 最大 dp 乘积


 

 

变量简洁正确完整思路

具有某种递推关系dpi,因为遇到负数则前面越小越好,所以维护dp2 i,遇到正数,则前面的越大越好,不要麻烦的ifelse,直接维护dp和dp2,一个最大一个最小   精确定义 dp i 第i个元素结尾连续数组最大乘积,dp0是空,dp1是第一个 dp2 i 第i个元素结尾连续数组最小乘积   递推 1 2 3 4  dp i =max(num,dp[i-1]*num,dp2[i-1]*num) -1 -2 -3 -4 dp2 i=min (num,dp[i-1]*num,dp2[i-1]*num)   初始化 dp 0 =0不能很小,不然dp2 1很小,为0正好防止误用,dp1能用num就用num dp2 0 =0,不能很大,不然dp1 1很大,为0正好防止误用,dp1能用num就用num
class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int n=nums.size();
        if(n==1)return nums[0];
        vector<int>dp(n+1,0);
        vector<int>dp2(n+1,0);
        for(int i=1;i<=n;i++){
            dp[i]=max(nums[i-1],max(dp[i-1]*nums[i-1],dp2[i-1]*nums[i-1]));
            dp2[i]=min(nums[i-1],min(dp[i-1]*nums[i-1],dp2[i-1]*nums[i-1]));
        }
        return *max_element(dp.begin(),dp.end());
    }
};

踩过的坑
这道题没有必要dp0是空,dp0完全可以是nums[0],因为我没有这么做,导致了dp1
没法取负数,因为dp0=0,导致了[-3]额外判断


状态压缩,因为dpi在全在等号左边,dpi-1全在等号右边,非常容易
class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int n=nums.size();
        if(n==1)return nums[0];
        vector<int>dp(2,0);
        vector<int>dp2(2,0);
        int ans=-0x3f3f3f3f;
        for(int i=1;i<=n;i++){
            dp[i%2]=max(nums[i-1],max(dp[(i-1)%2]*nums[i-1],dp2[(i-1)%2]*nums[i-1]));
            ans=max(ans,dp[i%2]);
            dp2[i%2]=min(nums[i-1],min(dp[(i-1)%2]*nums[i-1],dp2[(i-1)%2]*nums[i-1]));
        }
        return ans;
    }
};

 

标签:dp2,dp1,nums,int,num,数组,最大,dp,乘积
来源: https://www.cnblogs.com/zhouzihong/p/15101309.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有