题目
给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
思路1
双重循环进行遍历,超时。
思路2
动态规划,只需遍历一遍数组,针对数组中的每个元素记录一个最大值和一个最小值。最大值由这个元素、这个元素与上次记录的最大值乘积、这个元素与上次记录的最小值乘积这三个数值的最大值构成。最小值由这个元素、这个元素与上次记录的最大值乘积、这个元素与上次记录的最小值乘积这三个数值的最小值构成。每次遍历取上次最大值结果与本次最大值这两个数值的最大作为结果。
代码
class Solution {
public int maxProduct(int[] nums) {
if(nums.length==1){
return nums[0];
}
int maxnum=nums[0];
int minnum=nums[0];
int res=nums[0];
for(int i=1;i<nums.length;i++){
int maxnum_tmp=maxnum;
int minnum_tmp=minnum;
maxnum=max(nums[i],max(nums[i]*maxnum_tmp,nums[i]*minnum_tmp));
minnum=min(nums[i],min(nums[i]*maxnum_tmp,nums[i]*minnum_tmp));
res=max(res,maxnum);
}
return res;
}
public int max(int a,int b){
if(a>b){
return a;
}
return b;
}
public int min(int a,int b){
if(a>b){
return b;
}
return a;
}
}