题目
思路
- 第一反应还是dp,尝试做一下。dp不太能做出来,但是用普通的思想,将dp[i][j]视为nums数组从第i位到第j位的连续最大乘积,还是可以做出来的,但是这样暴力的话最后两个用例会超时。
for(int i=0;i<nums.length;i++){
for (int j =i;j< nums.length;j++){
if(i==j) dp[i][j]=nums[i];
else dp[i][j] = dp[i][j-1] * nums[j];
max = Math.max(max,dp[i][j]);
}
}
- 每轮都需要维护一个必须乘上nums[i]的最大值和最小值,所以在每轮开始之前要确定nums[i]的正负值,如果是负的则需要将最大值和最小值互换,然后才能开始算Max = Math.max(nums[i], Max*nums[i])等等,之后再维护即可;
代码
public int maxProduct(int[] nums) {
int ans = Integer.MIN_VALUE;
int Max = 1;
int Min = 1;
for(int i=0;i< nums.length;i++){
if(nums[i]<0){
int temp=Min;
Min = Max;
Max = temp;
}
Max = Math.max(nums[i], Max*nums[i]);
Min = Math.min(nums[i], Min*nums[i]);
ans = Math.max(ans,Max);
}
return ans;
}