他有负数,和普通的不一样。可能两个负数相乘她就变成正的了就最大了。
所以设两个数组,一个求最大值,一个求最小值。
最大值maxdp【i】的判定是nums[i]本身,和maxdp[i-1]*nums[i]以及mindp【i-1】*nums[i]取最大。
最小值mindp【i】的判定是nums[i]本身,和maxdp[i-1]*nums[i]以及mindp【i-1】*nums[i]取最小。
最后再一个for循环,取maxdp【i】的最大的。
class Solution {
public int maxProduct(int[] nums) {
int length = nums.length;
long[] maxF = new long[length];
long[] minF = new long[length];
for (int i = 0; i < length; i++) {
maxF[i] = nums[i];
minF[i] = nums[i];
}
for (int i = 1; i < length; ++i) {
maxF[i] = Math.max(maxF[i - 1] * nums[i], Math.max(nums[i], minF[i - 1] * nums[i]));
minF[i] = Math.min(minF[i - 1] * nums[i], Math.min(nums[i], maxF[i - 1] * nums[i]));
if (minF[i] < (-1 << 31)) {
minF[i] = nums[i];
}
}
int ans = (int) maxF[0];
for (int i = 1; i < length; ++i) {
ans = Math.max(ans, (int) maxF[i]);
}
return ans;
}
}