找出一个序列中乘积最大的连续子序列(至少包含一个数)。
样例
比如, 序列 [2,3,-2,4]
中乘积最大的子序列为 [2,3]
,其乘积为6
。
思路:想到以什么结尾这种模式。以i结尾的情况下子数组的最大乘积,有三种情况:
1.等于 以i-1结尾的情况下子数组的最小乘积*当前数(这是针对负数乘负数的情况)
2.等于 以i-1结尾的情况下子数组的最大乘积*当前数(这是针对正数乘正数的情况)
3.等于 当前数(比如 当前数的前一个数是0等情况)
取这三种情况的最大值为当前位置能乘出来的的最大值
这三种情况的最小值为当前位置能乘出来的的最小值
更新维护这两个数组
上代码:
public class Solution { /** * @param nums: an array of integers * @return: an integer */ public int maxProduct(int[] nums) { // write your code here if(nums==null||nums.length==0){ return 0; } int len=nums.length; int[] max=new int[len]; int[] min=new int[len]; max[0]=nums[0]; min[0]=nums[0]; for(int i=1;i<len;i++){ max[i]=Math.max(max[i-1]*nums[i],Math.max(nums[i],min[i-1]*nums[i])); min[i]=Math.min(max[i-1]*nums[i],Math.min(nums[i],min[i-1]*nums[i])); } int ma=Integer.MIN_VALUE; for(int i=0;i<len;i++){ if(max[i]>ma){ ma=max[i]; } } return ma; } }