今日心情: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。