LeetBook刷题笔记018:乘积最大子数组(Java实现)
题目
给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。
子数组 是数组的连续子序列。
最优解:动态规划
public int maxProduct(int[] nums) {
int n = nums.length;
if(n == 1)
return nums[0];
int dp_max = nums[0];
int dp_min = nums[0];
int max = nums[0];
for(int i=1;i<n;i++){
//可能下一个为负数使最大值变成最小值
//故需要同时维护以i结尾的最小连续子数组区间
//遇到小于0元素判断时进行交换使之前的最小子数组进行最大比较操作
if(nums[i]<0){
int temp = dp_max;
dp_max = dp_min;
dp_min = temp;
}
//注意dp==0的情况
dp_max = Math.max(dp_max*nums[i],nums[i]);
dp_min = Math.min(dp_min*nums[i],nums[i]);
max = Math.max(max,dp_max);
}
return max;
}