乘积最大子数组
题目描述
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
示例1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
解题方法:
-
判断数组长度len,若为len=0,return 0,反之,执行下一步;
-
定义二维数组,存储连续数值之间乘积的大小int[][] dp= new int[len][2];
-
赋初值:dp[0][0] = nums[0];dp[0][1] = nums[0];
-
for循环遍历,将min存储在dp[i][0]中,将max存储在dp[i][1]中;
a. 若nums[i]>=0:有
dp[i][0] = Math.min(nums[i],dp[i-1][0]*nums[i];(i>=1)
dp[i][0] = Math.max(nums[i],dp[i-1][1]*nums[i];(i>=)
b. 若nums[i]<0:有
dp[i][0] = Math.min(nums[i],dp[i-1][1]*nums[i];(i>=1)
dp[i][0] = Math.max(nums[i],dp[i-1][0]*nums[i];(i>=) -
从dp[i][1]中找出最大的值,即为乘积最大的数
代码实现:
public class Solution {
public int maxProduct(int[] nums) {
int len = nums.length;
if(len ==0 ) return 0;
int[][] dp = new int[len][2];
dp[0][0] = nums[0];
dp[0][1] = nums[0];
for(int i=1;i<len;i++){
if(nums[i]>=0){
dp[i][0] = Math.min(nums[i],dp[i-1][0]*nums[i]);
dp[i][1] = Math.max(nums[i],dp[i-1][1]*nums[i]);
}else{
dp[i][0] = Math.min(nums[i],dp[i-1][1]*nums[i]);
dp[i][1] = Math.max(nums[i],dp[i-1][0]*nums[i]);
}
}
int temp = dp[0][1];
for(int i=1;i<len;i++){
temp = Math.max(temp,dp[i][1]);
}
return temp;
}
}