思路:
动态规划,但是此题不是使用dp,因为要记录2个数,min和max
代码:
class Solution {
public int maxProduct(int[] nums) {
//不能只使用dp,因为max和min都要记录
//imax和imin都初始化为1
int max=Integer.MIN_VALUE,imax=1,imin=1;
for(int num:nums){
//当前数是负数时,调换最大和最小数
//因为负数*最小数就是最大数
//负数*最大数就是最小数
if(num<0){
int temp=imax;
imax=imin;
imin=temp;
}
imax=Math.max(num,imax*num);
imin=Math.min(num,imin*num);
max=Math.max(max,imax);
}
return max;
}
}
分解:
1)不止要记录最大数,还要记录最小数,因为此题存在负数,例如:[-2,3,-4],最大值不是3,而是24
i)负数*最小数就是最大数
ii)负数*最大数就是最小数
2)max和min都初始化为1
复杂度分析:
时间复杂度:O(N)
空间复杂度:O(1)