动态规划--乘积最大子数组

题目:

 

其为动态规划,与上一题的线性求和的方法十分的类似,主要是用dp数组去保存当前最大值,最大值可以为前一个dp[i-1]去运算得到,或者自己重新开始,所以要进行比较,但因为这是乘法,要考虑到正负数的问题

负数越小,那么该数字的绝对值是越大的所以,如果本身是负数的话,就要求找到其最小值与之相乘,如果是正数的话,那么我们要找到最大值去与之相乘

于是我们可以开辟两个数组,保存最大与最小,还有这个数自己去作比较

 

 

 

 

 

插一句,Math.max函数没有int,int,int,参数,所以要用两个math函数

代码如下

 

 

 

 

 

 

 

class Solution {
    public int maxProduct(int[] nums) {
       //优化了下性能,
        int len =nums.length;
        if(len==0){
            return 0;
        }
        if(len==1){
            return 1;
        }
        int[] dpMax=new int[len];
         int[] dpMin=new int[len];
        dpMax[0]=nums[0];
           dpMin[0]=nums[0];
 
//动态规划中有dp[i-1]这种类型的数组,于是要判断下i的起始位置,从1开始,既然从1开始,那么就一定要记得对dpMax和dpmin初始化
for(int i=1;i<len;i++){
            dpMax[i]=Math.max(nums[i],Math.max(nums[i]*dpMax[i-1],nums[i]*dpMin[i-1]));
            dpMin[i]=Math.min(nums[i],Math.min(nums[i]*dpMax[i-1],nums[i]*dpMin[i-1]));
        }
//一开始我是赋值为0,后来想想不对,这里面有负数,所以初始化的时候也要适当的思考下
int max=dpMax[0]; for(int j=0;j<len;j++){ max=Math.max(dpMax[j],max); } return max; } }

 

 AC了,这题和上一题差不多,我感觉我进度没推进,害

 

 

 

 

 

posted @ 2021-09-26 23:33  橘子味汽水  阅读(56)  评论(0编辑  收藏  举报