解题思路:比较明显的动态规划问题,问题的点在于,由于负号的乘法特性,可以有负负得正的情况,即当前位置的最优解未必是由前一个位置的最优解转移得到的,因此按照普通的动态规划进行状态转移。另外设置变量记录当前位置的最小值minF(即考虑出现负号的情况)。
//动态规划。当前位置的最优解未必是由前一个位置的最优解转移得到的
//因此还要记录当前的最小值(即考虑出现负号的情况)
class Solution {
public int maxProduct(int[] nums) {
int maxF = nums[0], minF = nums[0], res = nums[0];
for(int i=1; i<nums.length; i++){
int mx = maxF, mn = minF;
maxF = Math.max(mx*nums[i], Math.max(mn*nums[i], nums[i]));
minF = Math.min(mn*nums[i], Math.min(mx*nums[i], nums[i]));
res = Math.max(maxF, res);
}
return res;
}
}