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;
    }
}

在這裏插入圖片描述

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