题目:Maximum Product Subarray
难度:medium
问题描述:
Given an integer array nums
, find the contiguous subarray within an array (containing at least one number) which has the largest product.
Example 1:
Input: [2,3,-2,4]
Output: 6
Explanation: [2,3] has the largest product 6.
Example 2:
Input: [-2,0,-1] Output: 0 Explanation: The result cannot be 2, because [-2,-1] is not a subarray.
求解思路:
使用动态规划,从左到右计算以num[i]结尾的最大积子串max[i]和最小积子串min[i]。
当num[i]>=0时:
max[i] = MAX(num[i] , max[i-1]*nums[i]);min[i] = MIN(num[i] , min[i-1]*nums[i]);
当num[i]<=0时:
max[i] = MAX(num[i] , min[i-1]*nums[i]);min[i] = MIN(num[i] , max[i-1]*nums[i]);
代码如下:
public static int maxProduct(int[] nums) {
if(nums.length==1) return nums[0];
int[] max = new int[nums.length];
int[] min = new int[nums.length];
max[0]=nums[0];min[0]=nums[0];
int res = Integer.MIN_VALUE;
for(int i=1;i<nums.length;i++){
//[2,3,-2,4]
if(nums[i]<0){
max[i] = Math.max(min[i-1]*nums[i], nums[i]);
min[i] = Math.min(max[i-1]*nums[i], nums[i]);
}else{
max[i] = Math.max(max[i-1]*nums[i], nums[i]);
min[i] = Math.min(min[i-1]*nums[i], nums[i]);
}
res = res<max[i]?max[i]:res;
System.out.println(max[i]+":"+min[i]);
}
return res = res<max[0]?max[0]:res;
}