乘積最大子序列
阿新 • • 發佈:2019-01-02
最大乘積可以由正數乘正數或者負數乘負數得到,所以在掃描過程中需要記錄兩個數值,一個最大值(max),一個最小值(min)。
如果當前元素大於等於0,那麼通過比較max*nums[i]和nums[i]的大小就可以得到到i為止的最大乘積子序列。
如果當前元素小於0,通過比較min*nums[i]和nums[i]的大小就可以得到到i為止的最大乘積子序列。
所以可以得到狀態轉移方程為:
當nums[i]>=0時
當nums[i]<0時
注意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; } }