在一个数组中,找出一个连续的子数组,使得子数组中元素的乘积最大。比如,对于数组[2,3,-2,4],
满足要求的子数组[2,3],其乘积为6。
题目分析:
这题跟“最大连续子数列和”非常类似,只不过变成了“最大连续子数列积”,所以解决思路也很类似。
仅仅有一个小细节需要注意,就是负负得正,两个负数的乘积是正数,因此我们不仅要跟踪最大值,还要跟踪
最小值。
public int maxProduct(int[] nums)
{
if (nums == null || nums.length < 1)
return 0;
if (nums.length == 1)
return nums[0];
int i=0, j=0;
int n = nums.length;
int[] b = new int[nums.length];
b[0] = nums[0]; // 表示到nums[0]为止的乘积最大值
int[] a = new int[nums.length];
a[0] = nums[0]; // 表示到nums[0]为止的乘积最小值
int p = nums[0];
for (i=1; i<nums.length; i++)
{
b[i] = Math.max(Math.max(nums[i], b[i-1]*nums[i]), a[i-1]*nums[i]); // 2 -1 -9 -2
a[i] = Math.min(Math.min(nums[i], a[i-1]*nums[i]), b[i-1]*nums[i]);
}
return maxL(n, b);
}
// 打擂台
int maxL(int n, int[] b)
{
int tmp = 0;
for (int i = 0; i < n; i++)
if (b[i] > tmp)
tmp = b[i];
return tmp;
}