標籤:style product value imu amp max font new maximum
題目:
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array [2,3,-2,4],
the contiguous subarray [2,3] has the largest product = 6.
題意及分析:給出一個數組,求出乘積最大的子數組。這道題可以使用動態規劃的方法求解,我使用兩個數組posRes和nonPosRes分別用來儲存到當前元素的最大的正乘積和最小的負乘積。分析可知,除了只有一個負數的情況下,子數組最大乘積肯定大於等於1。所以對於數組第i-1個元素nums[i-1],我們可以看出到當前這個數的最大乘積可能情況有三種:
(1)posRes[i-1]*nums[i-1]>0,那麼當前最大值就是posRes[i-1]*nums[i-1];若小於0,那麼最大負值就是posRes[i-1]*nums[i-1]
(2)nonPosRes[i-1]*nums[i-1]>0,那麼當前最大值就是nonPosRes[i-1]*nums[i-1];若大於0,那麼最大正值就是nonPosRes[i-1]*nums[i-1]
(3)對posRes[i-1]*nums[i-1]==0和nonPosRes[i-1]*nums[i-1]==0單獨處理,具體看代碼
然後遍曆整個數組即可,時間複雜度為o(n),空間複雜度也是o(n)
代碼:
public class Solution { public int maxProduct(int[] nums) { int length=nums.length;if(length==1)return nums[0]; int[] posRes=new int[length+1];//記錄到當前點的正最大積 int[] nonPosRes=new int[length+1];//記錄到當前點的負最大積 int max=Integer.MIN_VALUE; posRes[0]=1; nonPosRes[0]=1; for(int i=1;i<length+1;i++){ int a=posRes[i-1]*nums[i-1]; int b=nonPosRes[i-1]*nums[i-1]; if(a>0){ posRes[i]=a; }else if(a<0) nonPosRes[i]=a; if(b<0) nonPosRes[i]=b; else if(b>0) posRes[i]=b; if(posRes[i]==0&&nums[i-1]>=0){ posRes[i]=nums[i-1]; } if(nonPosRes[i]==0&&nums[i-1]<=0) nonPosRes[i]=nums[i-1]; if(posRes[i]>max) max=posRes[i]; } return max; }}
[LeetCode] 152. Maximum Product Subarray Java