LeetCode——152.乘积最大子数组
题目
152.乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
解析
连续子数组,就是比如示例1中,[2,3]就是连续子数组,[2,-2]就不是连续子数组,[2,4]更不是。
还需要一个min_dp[]数组就是为了防止负负得正的情况,使乘积变大。
代码
class Solution {
public int maxProduct(int[] nums) {
//获取数组长度
int len = nums.length;
if (len == 0){
return 0;
}
//定义两个数组来存放最大值和最小值
int[] max_dp = new int[len];
int[] min_dp = new int[len];
//对第一个元素进行赋值
max_dp[0] = nums[0];
min_dp[0] = nums[0];
//实现状态转移方程
for (int i = 1; i < len; i++) {
if (nums[i] >= 0) { //如果第i个数为正数或0
min_dp[i] = Math.min(nums[i], nums[i] * min_dp[i - 1]);
max_dp[i] = Math.max(nums[i], nums[i] * max_dp[i - 1]);
} else { //如果第i个数为负数
min_dp[i] = Math.min(nums[i], nums[i] * max_dp[i - 1]);
max_dp[i] = Math.max(nums[i], nums[i] * min_dp[i - 1]);
}
}
//只考虑乘积最大的结果,对max_dp[]进行遍历即可
int res = max_dp[0];
for (int i = 0; i < len; i++) {
res = Math.max(res,max_dp[i]);
}
return res;
}
}