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; } }
Python
class Solution: def maxProduct(self, nums: List[int]) -> int: if not nums or len(nums)==0: return 0 res=nums[0] premin=nums[0] premax=nums[0] for i in range(1, len(nums)): tempmin = premin premin = min(nums[i], min(nums[i]*tempmin, nums[i]*premax)) premax = max(nums[i], max(nums[i]*tempmin, nums[i]*premax)) res = max(res, premax) return res
NOTES:
- 动态规划
- 套用子数组最大和方法,不适用,当前位置的最优解并不是由前一个位置的最优解转移得到的。
- 当前位置可正可负,所以以当前元素为结尾的子数组最优解为max(num[i], num[i]*min, num[i]*max),min,max分别代表当前位置前面可形成的最大值和最小值
- 将每步的最大值与全局最大取最大,注意计算min,max时使用临时变量记录上一次状态值,以免本次循环中使用最新覆盖值