样例
比如, 序列 [2,3,-2,4]
中乘积最大的子序列为 [2,3]
,其乘积为6
。
当全部为正数的时候,乘积肯定为最大,但是由于有负数出现,只有偶数情况的负数才能转正
所以前面乘积的负数在未来可能变成最大,所以需要分别记录 i 之前的连续乘积的最大和最小值
public class Solution {
/*
* @param nums: An array of integers
* @return: An integer
*/
//最大积、最小积
public int maxProduct(int[] nums) {
int n = nums.length;
int minMul = nums[0];
int maxMul = nums[0];
int max=maxMul;
for(int i=1; i<n; i++){
//maxMul=max(自身,和i前最小积的乘积,和i前最大积的乘积)
int tMaxMul = maxMul;
int tMinMul = minMul;
maxMul = Math.max(nums[i], Math.max(nums[i]*tMinMul, nums[i]*tMaxMul));
minMul = Math.min(nums[i], Math.min(nums[i]*tMinMul, nums[i]*tMaxMul));
max = Math.max(max, maxMul);
}
return max;
}
//暴力,超内存
public int maxProduct_enum(int[] nums) {
int n = nums.length;
//dp[i][j]表示i~j区间的最大乘积
int[][] dp = new int[n][n];
int max=Integer.MIN_VALUE;
for(int len=1; len<=n; len++){
for(int i=0; i+len-1<n; i++){
int j = i+len-1;
//dp[i][j] = nums[j];
if(i==0)
dp[i][j] = (j==0?1:dp[i][j-1])*nums[j];
else if(i==j){
dp[i][j] = nums[j];
}else{
if(nums[i-1]==0){
dp[i][j]=dp[i][j-1]*nums[j];
}else{
dp[i][j]=dp[i-1][j-1]/nums[i-1]*nums[j];
}
}
max = Math.max(max, dp[i][j]);
}
}
return max;
}
}