题目
解析
在了解连续子数组最大乘积之前,请先参考数组中连续子数组的最大和(LeetCode53. 最大子序和)
比起连续子数组最大和只记录当前元素加和的结果sum,连续子数组最大乘积中需要记录的是当前元素乘积的最大值max和最小值min,这是由于最大的乘积可能是最大的正值,也可能是最大的负值(也就是最小值),再与当前元素乘积得到的。与连续子数组最大和相同的需要记录当前元素的最大乘积result。假设当前数组nums,遍历到下标为i的元素上,计算max*nums[i],min*nums[i]和nums[i]中的最大值max和最小值min,更新最大值max和最小值min。如果最大值max大于result值,更新result记录下这个更大的值。
代码
public int maxProduct(int[] nums) {
int max = nums[0]; int min = nums[0]; int result = nums[0];
for(int i = 1; i < nums.length; ++i){
int max0 = max; int min0 = min;
max = maxThreeNums(max0 * nums[i], min0 * nums[i], nums[i]);
min = minThreeNums(max0 * nums[i], min0 * nums[i], nums[i]);
if(max > result){
result = max;
}
}
return result;
}
private int maxThreeNums(int a, int b, int c){
return Math.max(Math.max(a, b), c);
}
private int minThreeNums(int a, int b, int c){
return Math.min(Math.min(a, b), c);
}
网友评论