力扣(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;
-
- }
- }