给定一个整数数组 nums
,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
乘法会出现负数,负的越大绝对值就越大,如果它再乘以一个负数,那么它的值可能比正的相乘还大,所以有2种状态转移,另外如果不要前面的数相乘更大,那就把前面的数cut了,自己开始,这和最大连续字段和的思想很像
leetcode 53. 最大子序和(Maximum Subarray)
class Solution {
public int maxProduct(int[] nums) {
int max[] = new int[nums.length];
int min[] = new int[nums.length];
int res = nums[0];
max[0] = min[0] = nums[0];
for(int i=1;i<nums.length;i++){
int num = nums[i];
max[i] = Math.max(Math.max(max[i-1]*num,min[i-1]*num),num);
min[i] = Math.min(Math.min(min[i-1]*num,max[i-1]*num),num);
res = Math.max(max[i],res);
}
return res;
}
}
public int maxProduct(int[] nums) {
int x = nums[0];//正
int y = nums[0];//负
int ans = nums[0];
for(int i=1;i<nums.length;i++) {
int u=x,v=y;
x = Math.max(nums[i], Math.max(u*nums[i], v*nums[i]));
y = Math.min(nums[i], Math.min(u*nums[i], v*nums[i]));
ans = Math.max(ans, x);
}
return ans;
}