思路:
最长连续子序列,从前向后遍历一遍,有两种选择,一种是和前一个位置连在一起,另一种是另开一个子序列。
由于存在负数,所以同时记录乘积最大和乘积最小子数组,取最大和最小值的时候,nums[i - 1]*nums[i],nums[i], 和 min[i - 1]*nums[i] 三个取最大和取最小。
代码:
class Solution {
public int maxProduct(int[] nums) {
int n = nums.length;
int[] maxN = new int[n];
int[] minN = new int[n];
maxN[0] = nums[0];
minN[0] = nums[0];
int ans = maxN[0];
for(int i = 1; i < n; i++) {
maxN[i] = Math.max(maxN[i - 1] * nums[i], Math.max(minN[i - 1] * nums[i], nums[i]));
minN[i] = Math.min(maxN[i - 1] * nums[i], Math.min(minN[i - 1] * nums[i], nums[i]));
ans = Math.max(ans, maxN[i]);
}
return ans;
}
}
参考: