1 力扣题152:乘积最大子数组
1.1 题目描述
给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。
子数组 是数组的连续子序列。
1.2 思路分析
1.2.1 双重循环
可以直接双重循环,但是存在很多冗余信息
1.2.2 动态规划
存在最优子结构,找出状态转移方程 maxF[i] = Math.max(maxF[i - 1] * nums[i],
Math.max(nums[i], minF[i - 1] * nums[i])); minF[i] = Math.min(minF[i -
1] * nums[i], Math.min(nums[i], maxF[i - 1] * nums[i]));
1.3 代码实现
1.3.1 双重循环
public int maxProduct(int[] nums) {
int result = Integer.MIN_VALUE;
for (int i=0; i<nums.length; i++) {
int tmp_max = nums[i];
int pivot = nums[i];
for (int j=i+1; j<nums.length; j++) {
pivot *= nums[j];
tmp_max = Math.max(pivot,tmp_max);
}
result = Math.max(tmp_max,result);
}
return result;
}
1.3.2 动态规划
public int maxProduct(int[] nums) {
int length = nums.length;
int[] maxF = new int[length];
int[] minF = new int[length];
maxF[0] = nums[0];
minF[0] = nums[0];
for (int i = 1; i < length; ++i) {
maxF[i] = Math.max(maxF[i - 1] * nums[i], Math.max(nums[i], minF[i - 1] * nums[i]));
minF[i] = Math.min(minF[i - 1] * nums[i], Math.min(nums[i], maxF[i - 1] * nums[i]));
}
int ans = maxF[0];
for (int i = 1; i < length; ++i) {
ans = Math.max(ans, maxF[i]);
}
return ans;
}