• 2.18
    • 好多小瑕疵,不知道是不是没睡够的原因
    • i 从 1 开始
    • 用全局参数保存最终结果

$maxF[i] = max(nums[i], nums[i] * maxF[i-1], nums[i] * minF[i-1]);$ $minF[i] = min(nums[i], nums[i] * maxF[i-1], nums[i] * minF[i-1]);$

  • 2.4
    • 两组参数,一组全局,一组临时存储上一组的全局参数
class Solution {
    public int maxProduct(int[] nums) {
        int Max = nums[0];
        int Min = nums[0];
        int ans=nums[0];
        for(int i=1;i<nums.length;i++){
            int currentMax = Max;
            int currentMin = Min;
            Max = Math.max(nums[i],Math.max(nums[i]*currentMax,nums[i]*currentMin));
            Min = Math.min(nums[i],Math.min(nums[i]*currentMax,nums[i]*currentMin));
            ans = Math.max(Max,ans);
 
        }
        return ans;
    }
}
  • 12.4

    • 这道题不用dp数组,用存储的上次的最大值最小值做dp[i-1],然后更新最大值最小值
  • 这里nums[i-1]是用lastMin保存

class Solution {
    public int maxProduct(int[] nums) {
        int n = nums.length;
        int maxF = nums[0],minF = nums[0],ans = nums[0];
        for(int i=1;i<n;i++){
            int x = nums[i];
            int lastMax = maxF,lastMin = minF;
            maxF = Math.max(x,Math.max(x*lastMax,x*lastMin));
            minF = Math.min(x,Math.min(x*lastMax,x*lastMin));
            ans = Math.max(ans,maxF);
        }
        return ans;
    }
}
  • 这里的难点是负数会让最大值上下翻飞,所以同时存储最大值和最小值,不用dp数组