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

50 阅读1分钟

// 乘积最大子数组-动态规划  
// 输入: nums = [2,3,-2,4]  
// 输出: 6  
// 解释: 子数组 [2,3] 有最大乘积 6。  
public static int maxProductOne(int[] nums){  
    int len=nums.length;  
    int[] maxF=new int[len];  
    int[] minF=new int[len];  
    System.arraycopy(nums,0,maxF,0,len);  
    System.arraycopy(nums,0,minF,0,len);  
    for (int i = 1; i <len ; i++) {  
        // nums[i]为正数 maxF[i-1]*nums[i]  
        // nums[i]为负数 minF[i-1]*nums[i] ,nums[i]  
        maxF[i]=Math.max(maxF[i-1]*nums[i],  
        Math.max(nums[i],minF[i-1]*nums[i]));  

        // nums[i]为正数 minF[i-1]*nums[i]  
        // nums[i]为负数 maxF[i-1]*nums[i] ,nums[i]  
        minF[i]=Math.min(minF[i-1]*nums[i],  
        Math.min(nums[i],maxF[i-1]*nums[i]));  
    }  
    int ans=maxF[0];  
    for (int i = 1; i <len ; i++) {  
        ans=Math.max(ans,maxF[i]);  
    }  
    return ans;  
}  
  
public static int maxProduct(int[] nums){  
    int maxF=nums[0],minF=nums[0],ans=nums[0];  
    int len=nums.length;  
    for (int i = 1; i <len ; i++) {  
        int mx=maxF,mn=minF;  
        maxF=Math.max(mx*nums[i],Math.max(nums[i],mn*nums[i]));  
        minF=Math.min(mn*nums[i],Math.min(nums[i],mx*nums[i]));  
        ans=Math.max(maxF,ans);  
    }  
    return ans;  
}