1. 程式人生 > >LeetCode152——乘積最大子序列

LeetCode152——乘積最大子序列

我的LeetCode程式碼倉:https://github.com/617076674/LeetCode

原題連結:https://leetcode-cn.com/problems/maximum-product-subarray/description/

題目描述:

知識點:動態規劃

思路一:暴力破解法

時間複雜度是O(n ^ 2),其中n是nums陣列中的元素個數。空間複雜度是O(1)。

JAVA程式碼:

public class Solution {
    public int maxProduct(int[] nums) {
        int result = Integer.MIN_VALUE;
        for(int i = 0; i < nums.length; i++){
            int temp = 1;
            for(int j = i; j < nums.length; j++){
                temp *= nums[j];
                if(temp > result){
                    result = temp;
                }
            }
        }
        return result;
    }
}

LeetCode解題報告:

思路二:動態規劃

狀態定義

f(x) -------- nums陣列中[0, x]範圍內的最大連續子序列的乘積,且該連續子序列以nums[x]結尾

g(x) -------- nums陣列中[0, x]範圍內的最小連續子序列的乘積,且該連續子序列以nums[x]結尾

狀態轉移

(1)當x等於0時,顯然此時[0, x]範圍內只有一個元素,f(0)和g(0)均等於這個唯一的元素。

(2)當x大於0時

a:如果nums[x] >= 0,f(x) = max(f(x - 1) * nums[x], nums[x]),g(x) = min(g(x - 1) * nums[x], nums[x])

b:如果nums[x] < 0,f(x) = max(g(x - 1) * nums[x], nums[x]),g(x) = min(f(x - 1) * nums[x], nums[x])

時間複雜度和空間複雜度均為O(n),其中n是nums陣列中的元素個數。

JAVA程式碼:

public class Solution {
    public int maxProduct(int[] nums) {
        int[] maxdp = new int[nums.length];
        int[] mindp = new int[nums.length];
        maxdp[0] = mindp[0] = nums[0];
        for(int i = 1; i < nums.length; i++){
            if(nums[i] >= 0){
                maxdp[i] = Math.max(maxdp[i - 1] * nums[i], nums[i]);
                mindp[i] = Math.min(mindp[i - 1] * nums[i], nums[i]);
            }else{
                maxdp[i] = Math.max(mindp[i - 1] * nums[i], nums[i]);
                mindp[i] = Math.min(maxdp[i - 1] * nums[i], nums[i]);
            }
        }
        int result = Integer.MIN_VALUE;
        for(int i = 0; i < maxdp.length ; i++){
            if(maxdp[i] > result){
                result = maxdp[i];
            }
        }
        return result;
    }
}

LeetCode解題報告: