这道题,我们可以使用动态规划,假设数组元素范围是>=0,那么递推关系式表示为
imax = MAX(imax * nums[i], nums[i]),由于本题数组元素范围是整数,即存在负数,最大可能变最小,最小可能变最大,所以除了维护一个max,还需要维护一个imin,imin = MIN(imin * nums[i], nums[i]),在遇到负数时,需要将imax和imin进行交换,画草图如下
知道了思路,代码很容易就能敲出来,代码如下所示
class Solution {
public int maxProduct(int[] nums) {
if (nums.length == 1)
return nums[0];
int imax = 1, imin = 1, max = Integer.MIN_VALUE;
for (int i = 0; i < nums.length; i++) {
if (nums[i] < 0) {
int temp = imax;
imax = imin;
imin = temp;
}
imax = Math.max(imax * nums[i], nums[i]);
imin = Math.min(imin * nums[i], nums[i]);
max = Math.max(max, imax);
}
return max;
}
}
题目链接:题单 - 力扣(LeetCode)全球极客挚爱的技术成长平台