最大连续子序列乘积
参考这个题解:
求最大连续子序列乘积与最大连续子序列和问题有所不同,因为其中有正有负还有可能有0。
假设数组为a[],直接利用动归来求解,考虑到可能存在负数的情况,我们用Max[i]来表示以a[i]结尾的最大连续子序列的乘积值,用Min[i]表示以a[i]结尾的最小的连续子序列的乘积值,那么状态转移方程为:
Max[i]=max{a[i], Max[i-1]*a[i], Min[i-1]*a[i]};
Min[i]=min{a[i], Max[i-1]*a[i], Min[i-1]*a[i]};
代码如下:
public class Solution {
public int max3(int a, int b, int c){
return Math.max(Math.max(a, b), c);
}
public int min3(int a, int b, int c){
return Math.min(Math.min(a, b), c);
}
public int maxProduct(int[] nums) {
int max[] = new int[nums.length];
int min[] = new int[nums.length];
max[0] = nums[0];
min[0] = nums[0];
int maxProduct = max[0];
for (int i = 1; i < nums.length; i ++){
max[i] = max3(nums[i], max[i-1]*nums[i], min[i-1]*nums[i]);
maxProduct = Math.max(max[i], maxProduct);
min[i] = min3(nums[i], max[i-1]*nums[i], min[i-1]*nums[i]);
}
return maxProduct;
}
}