题目:152. 乘积最大子数组
思路:动态规划。
由于数字有正有负,我们记录以每个位置结尾的最大乘积和最小乘积,避免漏掉负负得正的情况。
那么,每个位置结尾的最大乘积,由三个值来比较:该位置的值、该位置的值乘上个位置的最大积、该位置的值乘上上个位置的最小积;三者取最大。
同理,每个位置结尾的最大乘积也由上述的三个值确定,三者取最小。
代码:
class Solution {
public int maxProduct(int[] nums) {
int n = nums.length;
int fmax = nums[0];
int fmin = nums[0];
int res = nums[0];
for (int i = 1; i < n; i ++) {
int max = Math.max(nums[i], Math.max(fmax * nums[i], fmin * nums[i]));
int min = Math.min(nums[i], Math.min(fmax * nums[i], fmin * nums[i]));
fmax = max;
fmin = min;
res = Math.max(max, res);
}
return res;
}
}