Maximum Product Subarray--lintcode

Description

Find the contiguous subarray within an array (containing at least one number) which has the largest product.

Example

For example, given the array [2,3,-2,4], the contiguous subarray [2,3] has the largest product = 6.

我的思路:動態規劃題。這個題目要注意的是負數。如果全是正數,全部相乘即爲最大。如果有負數,這個負數該不該乘。
既然是動態規劃,一般兩個for循環不能少。然後畫圖。可是這個圖 該怎麼畫圖,有點饒人。
這裏寫圖片描述
圖中虛線的下面部分是爲nums[i]。上面部分是nums[i]*nums[i-1].畫出這樣的圖之後 從矩陣中找到最大值。這個雖然是二維數組,但是我們可以優化成一維數組。而且衝與其從矩陣中找最大值,不如一邊給矩陣賦值,一遍找最大值。

 public int maxProduct(int[] nums) {
        // write your code here
        if(nums==null) return 0;
        int[] temp=new int[nums.length];
        int max=nums[0];
        temp[0]=nums[0];
        for(int i=1;i<nums.length;i++){
            temp[i]=nums[i]*temp[i-1];
            max=temp[i]>max?temp[i]:max;
        }
        //System.out.println(max);
        for(int i=1;i<nums.length;i++){
            for(int j=i;j<nums.length;j++){
                if(i==j) temp[j]=nums[i];
                else{
                      temp[j]=nums[j]*temp[j-1];
                }                
                max=temp[j]>max?temp[j]:max;              
            }
        }
        return max;

    }

別人的思路:在維護一個局部最大的同時,在維護一個局部最小,這樣如果下一個元素遇到負數時,就有可能與這個最小相乘得到當前最大的乘積和

參考博客:http://blog.csdn.net/linhuanmars/article/details/39537283

public int maxProduct(int[] A) {  
    if(A==null || A.length==0)  
        return 0;  
    if(A.length == 1)  
        return A[0];  
    int max_local = A[0];  
    int min_local = A[0];  
    int global = A[0];  
    for(int i=1;i<A.length;i++)  
    {  
        int max_copy = max_local;  
        max_local = Math.max(Math.max(A[i]*max_local, A[i]), A[i]*min_local);  
        min_local = Math.min(Math.min(A[i]*max_copy, A[i]), A[i]*min_local);  
        global = Math.max(global, max_local);  
    }  
    return global;  
}  
發佈了53 篇原創文章 · 獲贊 5 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章