算法练习- 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。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值