プログラミングの美:サブアレイの最大積


タイトル:Nの長さの整数配列を指定します。乗算だけで除算は許されません。N-1個の数の組み合わせの積の最大のセットを計算して、アルゴリズムの時間複雑さを書き出します。 
 最も直観的な解法O(n 2)
public static int getTheExpectValueNormal(int[] data){
    long result = Long.MIN_VALUE;
    int index = -1;
    for(int i = 0; i < data.length; i++){
        long r = 1;
        for(int j = 0; j < data.length; j++){
            if(j != i){
                r *= data[j];
            }
        }
        if(result < r){
            result = r;
            index = i;
        }
    }
    return data[index];
}
 
最適化解法O(n)
public static int getTheExpectValue(int[] data){
    int negativeCount = 0;//    
    int min = Integer.MAX_VALUE;//   
    int absMin = Integer.MAX_VALUE;//       
    int minPositive = Integer.MAX_VALUE;//    
    int maxNegative = Integer.MIN_VALUE;//    
    for(int i = 0; i < data.length; i++){
        negativeCount += data[i] < 0 ? 1 :0;
        min = min < data[i] ? min : data[i];
        absMin = Math.abs(absMin) = 0&& data[i] < minPositive ? data[i] : minPositive;
        maxNegative = data[i] < 0 &&data[i] > maxNegative ? data[i] : maxNegative;
    }
    if(absMin == 0){//        0   :          ,        >=0,  0;     0   
        return negativeCount % 2 == 0 ? 0 :maxNegative;
    }else if((negativeCount % 2 == 0) != (absMin > 0)){//                       ,          
        if(absMin > 0){//      (        )
            return maxNegative;
        }else{//       ,      
            return negativeCount == data.length ?min : minPositive;
        }
    }else{
        return absMin;
    }
}