算法练习- LeetCode 152. 乘积最大子数组

今日心情:stop wasting life

题目描述:

LeetCode 152. 乘积最大子数组

给你一个整数数组 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。


猜你喜欢

转载自blog.csdn.net/qq_41758969/article/details/125634634
今日推荐