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

乘積最大子序列

最大乘積可以由正數乘正數或者負數乘負數得到,所以在掃描過程中需要記錄兩個數值,一個最大值(max),一個最小值(min)。

如果當前元素大於等於0,那麼通過比較max*nums[i]和nums[i]的大小就可以得到到i為止的最大乘積子序列。

如果當前元素小於0,通過比較min*nums[i]和nums[i]的大小就可以得到到i為止的最大乘積子序列。

所以可以得到狀態轉移方程為:

當nums[i]>=0時

max = Math.max(max * nums[i], nums[i])

min = Math.min(min * nums[i], nums[i]);

當nums[i]<0時

max = Math.max(min * nums[i], nums[i])

min = Math.min(max(old) * nums[i], nums[i])

注意min裡面用到的max不是上一步計算得到的max,而是上一次得到的max。

程式碼:

class Solution {
     public static int maxProduct(int[] nums) {
        final int length = nums.length;
        int max = nums[0],min = nums[0],result = nums[0];
        if (length == 1){
            return result;
        }
        for (int i = 1; i < length; i++) {
            if (nums[i] >= 0){
                max = Math.max(max * nums[i], nums[i]);
                min = Math.min(min * nums[i], nums[i]);
            }else {
                int temp = max;
                max = Math.max(min * nums[i], nums[i]);
                min = Math.min(temp * nums[i], nums[i]);
            }
            result = Math.max(result, max);
        }

        return result;
    }
}