找出一个序列中乘积最大的连续子序列(至少包含一个数)。
这种找最大连续子序列的一般都是动态规划。由于我们不知道数的正负,因此我们要用两个数组来进行存储,一个用来存储最大值,一个用来储存最小值。如果当前的值为负数,那么它的最最大值可能是自己,也可能是和前面最小值得乘积。如果是正数的话,那就是当前数,或者和前面最大数的乘积。
public class Solution {
/**
* @param nums: An array of integers
* @return: An integer
*/
public int maxProduct(int[] nums) {
// write your code here
int n = nums.length;
if(n == 0)return 0;
int[] min = new int[n];
int[] max = new int[n];
min[0] = nums[0];
max[0] = nums[0];
for(int i = 1; i < n; i++){
max[i] = Math.max(nums[i], Math.max(nums[i] * min[i - 1], nums[i] * max[i - 1]));
min[i] = Math.min(nums[i], Math.min(nums[i] * min[i - 1], nums[i] * max[i - 1]));
}
int res = Integer.MIN_VALUE;
for(int i = 0; i < n; i++){
res = Math.max(res, max[i]);
}
return res;
}
}