今日心情:stop wasting life
题目描述:
给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。
子数组 是数组的连续子序列。
解题代码:
class Solution {
public int maxProduct(int[] nums) {
int len = nums.length;
int minFP = 1;
int maxFP = 1;
int maxT = Integer.MIN_VALUE;
for(int i = 0 ; i < len;i++){
if(nums[i] < 0){
int temp = maxFP;
maxFP = minFP;
minFP = temp;
}
minFP = Math.min(minFP*nums[i],nums[i]);
maxFP = Math.max(maxFP*nums[i],nums[i]);
maxT = Math.max(maxT,maxFP);
}
return maxT;
}
}
解题思路:(看的题解思路+自己的理解)
该题和累积和子数组相似,解题思路就要用到动态规划,不过需要考虑当前数为负数的时候,就需要到最小累积。
(1)使用 minFP 记录子串最小累积,如果 minFP ✖️ 当前数 比 当前数小,则更新 minFP ✖️ 当前数的结果作为 minFP ,否则 将 当前数 作为 minFP;
(2)使用 maxFP 记录子串最大累积,如果 maxFP ✖️ 当前数 比 当前数大,则更新 maxFP ✖️ 当前数的结果作为 maxFP ,否则 将 当前数 作为 maxFP;
(3)每次进行遍历的时候,首先判断当前数是否 小于0,如果 当前数小于 0, 则将 minFP 和 maxFP 的值 进行交换,因为 负数 乘以之前累积最小, 为当前累积最大,反之 负数 乘以之前累积最大, 为当前累积最小。
(4)每次更新 maxT 记录下最大值,遍历结束返回 maxT。