思路一:暴力。不同起点和终点的乘积挨个计算比较。
class Solution {
public int maxProduct(int[] nums) {
int max_pro=Integer.MIN_VALUE;
int temp_pro=1;
for(int i=0;i<=nums.length-1;i++) {
temp_pro=1;
for(int j=i;j>=0;j--) {
temp_pro*=nums[j];
max_pro=Math.max(max_pro, temp_pro);}
}
return max_pro;
}
}
思路二:使用两个临时变量,分别保存前i项乘积的最大值和最小值,因为后面的乘积大小只受这两个值影响。
时间复杂度为O(n),遍历一次后便可求出最大值。
class Solution {
public int maxProduct(int[] nums) {
int r=nums[0];
for(int i=1,imax=r,imin=r;i<=nums.length-1;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]);
r=Math.max(r,imax);
}
return r;
}
}