乘机最大子数组

DESC:

给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

示例 1:

输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。

示例 2:

输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-product-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

CODE:

JAVA:

class Solution {
    public int maxProduct(int[] nums) {
        if (nums == null || nums.length==0) {
            return 0;
        }
        int res = nums[0];
        int minVal = nums[0];
        int maxVal = nums[0];
        for (int i=1; i<nums.length; i++) {
            int temp = minVal;
            minVal = Math.min(nums[i], Math.min(nums[i]*temp, nums[i]*maxVal));
            maxVal = Math.max(nums[i], Math.max(nums[i]*temp, nums[i]*maxVal));
            res = Math.max(maxVal, res);
        }
        return res;
    }
}

 

NOTES:

  1. 动态规划
  2. 套用子数组最大和方法,不适用,当前位置的最优解并不是由前一个位置的最优解转移得到的。
  3. 当前位置可正可负,所以以当前元素为结尾的子数组最优解为max(num[i], num[i]*min, num[i]*max),min,max分别代表当前位置前面可形成的最大值和最小值
  4. 将每步的最大值与全局最大取最大,注意计算min,max时使用临时变量记录上一次状态值,以免本次循环中使用最新覆盖值

猜你喜欢

转载自blog.csdn.net/SeaSky_Steven/article/details/114608916