LeetCode152——乘積最大子序列
阿新 • • 發佈:2019-01-12
我的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解題報告: