力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
给你一个整数数组
nums
,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个 32-位 整数。
子数组 是数组的连续子序列。
题解:动态规划
状态转移方程为:dp[i] = max(dp[i - 1] * nums[i], nums[i])
为每一个状态只与前一个状态有关,可以使用「滚动变量」技巧,使用常数个变量完成这道问题
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
代码如下:
class Solution {
public int maxProduct(int[] nums) {
int preMax = nums[0];
int preMin = nums[0];
int curMax;
int curMin;
int res = nums[0];
for(int i = 1; i < nums.length;i++) {
if(nums[i] >=0){
curMax = Math.max(nums[i], preMax*nums[i]);
curMin = Math.min(nums[i], preMin*nums[i]);
}
else{
curMax = Math.max(nums[i], preMin*nums[i]);
curMin = Math.min(nums[i], preMax*nums[i]);
}
res = Math.max(curMax,res);
preMax = curMax;
preMin = curMin;
}
return res;
}
}