LeetCode152乘积最大子数组

乘积最大子数组>>>
LeetCode152乘积最大子数组_第1张图片

  • 遍历数组时计算当前最大值,不断更新
  • imax为当前最大值,则当前最大值为imax=max(imax*nums[i],nums[i]
  • 由于存在负数,那么会导致最大的变小,最小的边打,因此需要维护当前最小的值imin:imin = min(imin*nums[i],nuims[i](
  • 当负数出现时则imax与imin进行交换再进行下一步

 //动态规划
    //遍历数组时计算当前最大值,不断更新
    //另max为当前面最大值 则当前最大值为max = Math.max(max*nums[i],nums[i])
    //由于存在负数,那么会导致最大的变为最小,最小的变最大,因此还需要维护当前最小值min
    //当负数出现时则max和min要交换

    public int maxProduct(int[] nums) {

        int[] dp_max = new int[nums.length+1];
        int[] dp_min = new int[nums.length+1];
        if(nums.length == 0) return 0;
        int max = Integer.MIN_VALUE;


        // 由于存在负数,所以需要维护两个数组
        // dp_max[i] 指的是以第 i 个数结尾的 乘积最大 的连续子序列
        // dp_min[i] 指的是以第 i 个数结尾的 乘积最小 的连续子序列
        dp_max[0] = 1;
        dp_min[0] = 1;
        for (int i = 1;i <= nums.length;i++){


            // 如果数组的数是负数,那么会导致 max 变成 min,min 变成 max
            // 故需要交换dp
            if(nums[i-1] < 0){
                int temp = dp_min[i-1];
                dp_min[i-1] = dp_max[i-1];
                dp_max[i-1] = temp;
        }
            dp_min[i] = Math.min(nums[i-1],dp_min[i-1]*nums[i-1]);
            dp_max[i] = Math.max(nums[i-1],dp_max[i-1]*nums[i-1]);
            max = Math.max(max,dp_max[i]);
        }

        return max;


    }

你可能感兴趣的:(leetcode刷题笔记)