LeetCode——152.乘积最大子数组

LeetCode——152.乘积最大子数组

题目

152.乘积最大子数组

给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。

示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

解析

连续子数组,就是比如示例1中,[2,3]就是连续子数组,[2,-2]就不是连续子数组,[2,4]更不是。
还需要一个min_dp[]数组就是为了防止负负得正的情况,使乘积变大。

代码

class Solution {
    public int maxProduct(int[] nums) {
        //获取数组长度
        int len = nums.length;
        if (len == 0){
            return 0;
        }

        //定义两个数组来存放最大值和最小值
        int[] max_dp = new int[len];
        int[] min_dp = new int[len];

        //对第一个元素进行赋值
        max_dp[0] = nums[0];
        min_dp[0] = nums[0];

        //实现状态转移方程
        for (int i = 1; i < len; i++) {
            if (nums[i] >= 0) { //如果第i个数为正数或0
                min_dp[i] = Math.min(nums[i], nums[i] * min_dp[i - 1]);
                max_dp[i] = Math.max(nums[i], nums[i] * max_dp[i - 1]);
            } else { //如果第i个数为负数
                min_dp[i] = Math.min(nums[i], nums[i] * max_dp[i - 1]);
                max_dp[i] = Math.max(nums[i], nums[i] * min_dp[i - 1]);
            }
        }

        //只考虑乘积最大的结果,对max_dp[]进行遍历即可
        int res = max_dp[0];
        for (int i = 0; i < len; i++) {
            res = Math.max(res,max_dp[i]);
        }
        return res;
    }
}

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章